t趟,每趟先输入N,NxN矩阵(0为路,1为墙)、起点坐标x1、y1、终点坐标x2、y2.
运行结果如下:
#include<iostream>
#include<stack>
using namespace std;
struct P{//结点
int x,y;
};
int main(){
int t,n,i,j;
cin>>t;
while(t--){
cin>>n;
stack<P> p;
int **m=new int*[n];
for(i=0;i<n;i++)
m[i]=new int[n];
for(i=0;i<n;i++){//创建迷宫
for(j=0;j<n;j++)
cin>>m[i][j];
}
int x1,y1,x2,y2;//起点、终点坐标
cin>>x1>>y1>>x2>>y2;
p.push({x1,y1});//起点
m[0][0]=1;//访问过,设为1
i=x1;
j=y1;
while(1){//按"右下左上"的顺序试探是否可走
if(j+1<n&&m[i][j+1]==0){
m[i][j+1]=1;
p.push({i,++j});
}else
if(i+1<n&&m[i+1][j]==0){
m[i+1][j]=1;
p.push({++i,j});
}else
if(j-1>=0&&m[i][j-1]==0){
m[i][j-1]=1;
p.push({i,--j});
}else
if(i-1>=0&&m[i-1][j]==0){
m[i-1][j]=1;
p.push({--i,j});
}else {//往回退
p.pop();
if(!p.empty()){
i=p.top().x;
j=p.top().y;
}
}
if(p.empty()||(i==x2&&j==y2)){
break;
}
}
if(!p.empty()){//有结点,说明成功到终点
stack<P> q;
while(!p.empty()){//逆序,使路径从起点开始
q.push(p.top());
p.pop();
}
i=0;
while(!q.empty()){//输出,四个结点一行
cout<<'['<<q.top().x<<','<<q.top().y<<']'<<"--";
if((++i)%4==0)
cout<<endl;
q.pop();
}
cout<<"END"<<endl;
}else
cout<<"no path"<<endl;
}
return 0;
}