⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main

📁 AVR单片机系统开发经典实例部分源程序
💻
字号:
#include<iostream.h>
#include<fstream.h>
#include<stdlib.h>


struct bnode
{
   int x,y;                                        // 节点在的坐标
  
   int flag1;                                   //  存放方向
   bnode * prt;                                  //父指针
   bnode * link[4];
};
  bnode * head;
  bnode *q;
struct walked
{
	int x;
	int y;
};
  
  int i=0,f=0,top=0,h,l,start_X,start_Y;
   walked b[50];
  
  char stack[50],W,E,N,S;                           //存放路径
  
 
  
 void readfile(int map[50][50])
{
	ifstream infile("input.txt",ios::in|ios::nocreate);
	if(!infile)
	{
		cout<<"不能打开"<<"input.txt"<<"文件"<<endl;
		exit(1);
	}
	char ch;
	int i=0,j=0,r=0,c=0,n,z[20],flag;
	infile.unsetf(ios::skipws);
	while(infile>>ch)
	{
		if(ch>47&&ch<58||ch==' '||ch=='\n')                                //判断取到的是否是数字
		{
			z[i]=ch-48;          //ASCⅡ码减48为数字的实际值
			i++;
		}
		if(ch==' ')             //若是从文件提取的是空格,则把前面的数换算成十进制数,并副给行数
		{
			for(j=0,flag=i-j-2;j<i-2;j++)
			{
				n=flag;
				while(n>0)
				{z[j]=z[j]*10;
				n--;}
				r+=z[j];
				flag--;
			}
			r+=z[j];
		}
		else     
		{
		if(ch=='\n')   //若是从文件提取的是回车,则把回车前,空格后的数换算成十进制数,并副给列数
		{
			j=j+2;
			for(flag=i-j-2;j<i-2;j++)
			{
				n=flag;
				while(n>0)
				{
				z[j]=z[j]*10;
				n--;
				}
				c+=z[j];
				flag--;

			}
			c+=z[j];
			break;      //提取到第一个回车后既数字提取完毕,结束循环,并得到行列数
		}
		}
	}
	h=c;
	l=r;
	

	i=0,j=0;

	while(infile>>ch)          //第二次提取是接着第一次提取之后的,所以直接得到字母
	{
	   switch(ch){
       case 'W':{map[i][j]=1;j++;            //不论大小写字母均可识别
				break;}
	   
	   case 'G':{map[i][j]=1;j++;
				break;}
	   
	   case 'B':{map[i][j]=4;j++;
				break;}
	   
	   case 'F':{map[i][j]=5;j++;
				break;}
	   
	   case '.':{map[i][j]=0;j++;
				break;}
	   case 'S':{map[i][j]=2;j++;
				break;}
	   default:{
		if(ch=='\n') 
		{
			map[i][j]=1;
			j=0;
			i++;
		}
		else 
		{
			cout<<"地图有错或者地图格式不规范"<<endl;
			exit(1);
		}
			   }
	   }
	   } 
                                                  
	for(i=0;i<h+1;i++)                            //最后删除
	{
		for(j=0;j<l+1;j++)
		cout<<map[i][j]<<'\t';
	    cout<<endl;
        
	};
   

	infile.close();
}

void save(int x,int y,walked b[])
{
	b[i].x=x;
	b[i].y=y;
	i++;
}

int judge(int x,int y,walked b[])
{
	for(int i=0;i<100;i++)                                      //100可大可小
	{
		if(b[i].x==x&&b[i].y==y) return 1;
		if(b[i].x==0&&b[i].y==0)return 0;
	}
;
}

void renew(walked b[])
{
	for(int j=0;j<i;j++)
	{
		b[j].x=0;
		b[j].y=0;	
	}
i=0;
}

 
 void writefile(char a[])
{
	ofstream outfile("output.txt",ios::ate);
	if(! outfile)
	{
		cout<<"can not open the file"<<'\n';
	exit(1);
	}
	
	while(a[top-1]!=0&&top>0)
	{
		outfile<<a[top-1];
		top--;
		
	}	
		

	outfile.close();
}
 
 void freenode(bnode *h)
{
   bnode *H;
   while(h!=head)
   {
    H=h;
	h=h->prt;
	delete H;
   }; 
  delete h;
  
}
void addstack(bnode *p)
 {
                               //把路径读入数组
	while(p&&p!=head)
	 {
     switch(p->flag1)
	 {
	    case 1:
            stack[top]='N';
           top++;break;
		case 2:
			 stack[top]='S';
           top++;break;
		case 3:
			 stack[top]='W';
           top++;break;
		case 4:
			 stack[top]='E';
         top++;break;
		default:
		 break ;
	 }
     p=p->prt;
	 }
	 
  writefile(stack);
	freenode(q); 
 }

void judgewalk(int start_x,int start_y,int t,int a[50][50])                  //判断可以行动否并建立B-树
{
	int i=0;
   int flag=0; 
	bnode  *p;  
	int y=rand()%4; 

  if(a[start_x][start_y]!=t)                         //没有找到灭火器或者着火点 继续找
   {  
	  if(f==0)
	  {
		  head=new bnode;
	      head->x=start_x;
          head->y=start_y;
	      q=head;
          save(start_x,start_y,b);
	      f=1;
	  };
	  switch(y){
	  
	  case 0:i++;
      if(flag==0)    //向上
	  
	  {    
		   if(a[start_x-1][start_y]!=1&&start_x-1>=0&&!judge(start_x-1,start_y,b))
		   {
			   p=new bnode;
			   p->x=start_x-1;
			   p->y=start_y;	        
	           q->link[0]=p;           
			   p->prt=q;
	           p->flag1=1;
		       q=p;
			   save(start_x-1,start_y,b);
		       judgewalk(start_x-1, start_y,t,a);
		       flag=1;f=0;
		   }
	 }; 
	  //break;
	  case 1:i++;              //向右
      if(flag==0)
     
	 {    
		 if(a[start_x][start_y+1]!=1&&!judge(start_x,start_y+1,b))
		 {
		     p=new bnode;
			 p->x=start_x;
			 p->y=start_y+1;
	         q->link[3]=p;
			 p->prt=q;
	         p->flag1=4;
             q=p;
			 save(start_x,start_y+1,b);
	         judgewalk(start_x, start_y+1,t,a);
			 flag=1;f=0;
		 }
	   }; 
	 // break;
	  case 2:i++;
	  if(flag==0)   //向下
	 
	 {
		  if(a[start_x+1][start_y]!=1&&!judge(start_x+1,start_y,b))
		  {
		     p=new bnode;
			 p->x=start_x+1;
			 p->y=start_y;
	        
	         q->link[1]=p;
			 p->prt=q;
			 p->flag1=2;
			 q=p;
			 save(start_x+1,start_y,b);
	         judgewalk(start_x+1, start_y,t,a);
			 flag=1;f=0;
		  }
		
	  } ;//break;
	  case 3:i++;
     if(flag==0)    // 向左
	 {
	     if(a[start_x][start_y-1]!=1&&start_y-1>=0&&!judge(start_x,start_y-1,b)) 
		   { 
		      p=new bnode;
			 p->x=start_x;
			 p->y=start_y-1;
	        
	         q->link[2]=p;
			 p->prt=q;
	         p->flag1=3;
	       	 q=p;
			 save(start_x,start_y-1,b);
	         judgewalk(start_x, start_y-1,t,a);
			 flag=1;f=0;}
	
	 };
	 if(i!=4){
	   i++;
      if(flag==0)
	  
	  {    
		   if(a[start_x-1][start_y]!=1&&start_x-1>=0&&!judge(start_x-1,start_y,b))
		   {
			   p=new bnode;
			   p->x=start_x-1;
			   p->y=start_y;	        
	           q->link[0]=p;           
			   p->prt=q;
	           p->flag1=1;
		       q=p;
			   save(start_x-1,start_y,b);
		       judgewalk(start_x-1, start_y,t,a);
		       flag=1;f=0;
		   }
	 }; }
	 if(i!=4){
	  i++;
      if(flag==0)
     
	 {    
		 if(a[start_x][start_y+1]!=1&&!judge(start_x,start_y+1,b))
		 {
		     p=new bnode;
			 p->x=start_x;
			 p->y=start_y+1;
	         q->link[3]=p;
			 p->prt=q;
	         p->flag1=4;
             q=p;
			 save(start_x,start_y+1,b);
	         judgewalk(start_x, start_y+1,t,a);
			 flag=1;f=0;
		 }
	 }; }
	 if(i!=4){
	  i++;
	  if(flag==0)
	 
	 {
		  if(a[start_x+1][start_y]!=1&&!judge(start_x+1,start_y,b))
		  {
		     p=new bnode;
			 p->x=start_x+1;
			 p->y=start_y;
	        
	         q->link[1]=p;
			 p->prt=q;
			 p->flag1=2;
			 q=p;
			 save(start_x+1,start_y,b);
	         judgewalk(start_x+1, start_y,t,a);
			 flag=1;f=0;
		  }
		
	  } ;}
	 if(i=4){
	 if(flag==0)
		   {
	       p=q;q=q->prt;
		   delete p;
      judgewalk(q->x, q->y,t,a);

	 };}
	
   }
  }
   
   else{
	   if(flag==0)
	   {
		   a[q->x][q->y]=0;
		   renew(b);
	   }
		
   };
  
}


 
 void main(void)
 { 
	  int a[50][50];
	   for(int i=0;i<50;i++)
		  for(int j=0;j<50;j++)
		  {
		    a[i][j]=1;
		  }
	  int  sm=1;
	  readfile(a);
       int x1,y1;
      int n=0;
	 
     for(int j=0;j<h+1;j++)
	 {      
		 for(int k=0;k<l+1;k++)
	   {
		   switch(a[j][k])
		   {
		   
		      case 2:
			{
			 start_X=j;
		     start_Y=k;
			 break;
		 }
	    
		   case 4:
		  
			   n++;
		   break;
		   }
	   }
	 };

	 judgewalk(start_X, start_Y,4,a);
	 
	 while(sm<2*n)
	 {
		 x1=q->x;y1=q->y;
	   addstack(q);
		 if(sm%2) 
	   {
		   judgewalk(x1, y1,5,a);  
	   }
		 else
		 {
		   judgewalk(x1, y1,4,a); 
		 };
	   sm++;
	 };
	 if(sm=2*n)
		 addstack(q);
 }
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -