#include<iostream>
#define Maxsize 100
using namespace std;
struct Box{
int i,j;
int pre;
}e;
template<class T>
class Queue
{
T *data;
int front,rear;
public:
Queue(){
data=new T[Maxsize];
front=rear=-1;
}
~Queue(){
delete[] data;
}
bool Empty()
{
return(front==rear);
}
bool Push(T e)
{
if(rear==Maxsize-1)
return false;
rear++;
data[rear]=e;
return true;
}
bool Pop(T &e)
{
if(front==rear)
return false;
front++;
e=data[front];
return true;
}
int GetFront()
{
return front;
}
void print(int fro)
{
if(data[fro].pre==-1) //到起点终止
{
cout<<"("<<data[fro].i<<","<<data[fro].j<<")";
return;
}
print(data[fro].pre); //递归输出路径
cout<<"("<<data[fro].i<<","<<data[fro].j<<")";
}
};
int main()
{
Queue<Box> qe;
int sx,sy,fx,fy;
sx=sy=1; //定义初始位置和终点位置
int i,j,n,di;
int di_x[4]={-1,0,1,0};int di_y[4]={0,1,0,-1};
e.i=1,e.j=1,e.pre=-1;
qe.Push(e);
int mg[Maxsize][Maxsize]={0};
mg[sx][sy]=-1;
cin>>n;
fx=fy=n-2; //终点位置
for(i=0;i<n;i++)
for(j=0;j<n;j++)
cin>>mg[i][j];
while(!qe.Empty())
{
qe.Pop(e);
i=e.i,j=e.j;
if(i==fx && j==fy)
{
qe.print(qe.GetFront()); //根据方块pre值往回寻找路径
cout<<endl;
qe.~Queue();
exit(0);
}
for(di=0;di<4;di++)
{
if(mg[i+di_x[di]][j+di_y[di]]==0)
{
e.i=i+di_x[di],e.j=j+di_y[di];
e.pre=qe.GetFront(); //pre值用来保存上一个方块下标
qe.Push(e);
mg[i+di_x[di]][j+di_y[di]]=-1;
}
}
}
cout<<"NO"<<endl; //找到通路程序会终止,若没有终止则没有通路
return 0;
}
stl模板写法
#include<iostream>
#include<queue>
#define Maxsize 100
struct Box
{
int i;
int j;
}e,pre[Maxsize][Maxsize];
void print(Box t);
using namespace std;
int main()
{
int di_x[4]={-1,0,1,0};int di_y[4]={0,1,0,-1};
int n,i,j,x,y,flag=0,tx,ty;
queue<Box> qe;
cin>>n;
int sx,sy,fx,fy;
sx=sy=1;fx=fy=n-2; //定义起点和终点
e.i=sx;e.j=sy;
qe.push(e);
int mg[n][n]={0};
mg[sx][sy]=-1;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
cin>>mg[i][j];
while(!qe.empty())
{
e=qe.front();
x=e.i;y=e.j;
if(x==n-2 && y==n-2){
flag=1;
break;
}
for(i=0;i<4;i++){
tx=x+di_x[i],ty=y+di_y[i];
if(mg[tx][ty]==0){
e.i=tx;
e.j=ty;
pre[tx][ty]=qe.front();
qe.push(e);
mg[tx][ty]=-1;
}
}
qe.pop();
}
if(flag==0){
cout<<"NO"<<endl;exit(0);
}
Box fin={fx,fy};
print(fin);
cout<<endl;
}
void print(Box t)
{
if(t.i==1 && t.j==1){
cout<<"("<<t.i<<","<<t.j<<")";
return;
}
print(pre[t.i][t.j]);
cout<<"("<<t.i<<","<<t.j<<")";
}