📄 main
字号:
#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 + -