https://vjudge.net/contest/367192#problem/A
思路:我想的是利用类似链表的思想,在bfs中每次更新时符合要求的位置咬住原来的位置,ma[5*(x-1)+y]=5*(cur.x-1)+cur.y,以终点为起点,最后倒序输出。
AC代码:
#include<iostream> #include<cstdio> #include<algorithm> #include<queue> #include<map> using namespace std; int vis[6][6],maze[6][6],ma[36]; int dx[4]={0,0,1,-1}; int dy[4]={1,-1,0,0}; struct node{ int x,y; }; void bfs(){ node cur,ne; queue<node>sui; cur.x=5; cur.y=5; vis[5][5]=1; sui.push(cur); ma[25]=25; while(!sui.empty()){ cur=sui.front(); sui.pop(); for(int i=0;i<4;i++){ int x=cur.x+dx[i]; int y=cur.y+dy[i]; if(maze[x][y]==0&&vis[x][y]==0&&x>0&&x<=5&&y<=5&&y>0){ ne.x=x; ne.y=y; vis[x][y]=1; ma[5*(x-1)+y]=5*(cur.x-1)+cur.y; sui.push(ne); if(x==1&&y==1) return ; } } } } int main(){ for(int i=1;i<=5;i++){ for(int j=1;j<=5;j++){ cin>>maze[i][j]; } } bfs(); int idex=1; while(ma[idex]!=idex){ if(idex%5==0){ printf("(%d, %d) ",idex/5-1,4); }else{ printf("(%d, %d) ",idex/5,idex%5-1); } idex=ma[idex]; } printf("(%d, %d)",4,4); return 0; }