思路:
- BFS,记录路径。
- 简化版的【H - Pots】。
- 总结:
- 队列存状态,栈反序输出,结构体类型。
- 结构体中的前驱是数组编号。
- 边界停止搜索,标记不要忘记。
代码:
#include <iostream>
#include <queue>
#include <stack>
using namespace std;
const int mt[4][2] = {1,0 , -1,0 , 0,1 , 0,-1};
bool vis[5][5];
struct grid{
int x,y;
int pre;
};
grid G[105];int cnt = 1;
queue<grid> Q;
stack<grid> S;
void PUSHGRID(int x,int y,int pre){
grid t;
t.x = x;
t.y = y;
t.pre = pre;
Q.push(t);
vis[x][y] = true;
return ;
}
void BFS(){
while(Q.size()){
grid cur = Q.front();Q.pop();
G[cnt++] = cur;
int x = cur.x;
int y = cur.y;
if(x == y && x == 4)
return ;
for(int i=0;i<4;i++){
int nx = x + mt[i][0];
int ny = y + mt[i][1];
if(nx < 0 || ny < 0 || nx > 4 || ny > 4)
continue;
if(vis[nx][ny])
continue;
PUSHGRID(nx , ny , cnt-1);
}
}
return ;
}
void OUTPUT(){
grid cur = G[cnt-1];
while(true){
S.push(cur);
if(!cur.pre)
break;
cur = G[cur.pre];
}
while(S.size()){
cur = S.top();S.pop();
cout<<'('<<cur.x<<','<<' '<<cur.y<<')'<<endl;
}
return ;
}
int main(){
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
cin>>vis[i][j];
PUSHGRID(0,0,0);
BFS();
OUTPUT();
return 0;
}