poj 3984
阿新 • • 發佈:2018-04-23
acm求從左上角到右下角的最短路徑,1是路,2是墻,只可以前後左右的走。
dfs:
#include<cstdio> #include<cstring> using namespace std; int maze[5][5]; int ans; bool vis[5][5]; const int dir[4][2]={0,1,0,-1,1,0,-1,0}; struct node{ int x,y; } way[30],best[30]; void dfs(int nodex, int nodey, int deep){ int x,y; if(nodex==4&&nodey==4&&deep<ans){ ans=deep; for(int i=0;i<ans;i++){ best[i].x=way[i].x; best[i].y=way[i].y; } } for(int i=0;i<4;i++){ x=nodex+dir[i][0]; y=nodey+dir[i][1]; if(x<0||y<0||x>4||y>4||maze[x][y]==1||vis[x][y]==true) continue; else{ vis[x][y]=true; way[deep].x=x; way[deep].y=y; dfs(x,y,deep+1); vis[x][y]=false; } } } int main(){ for(int i=0;i<5;i++){ for(int j=0;j<5;j++){ scanf("%d",&maze[i][j]); } } ans=1000; memset(way,0,sizeof(way)); memset(best,0,sizeof(best)); memset(vis,false,sizeof(vis)); way[0].x=0; way[0].y=0; vis[0][0]=true; dfs(0,0,1); for(int i=0;i<ans;i++){ printf("(%d, %d)\n",best[i].x,best[i].y); } return 0; }
bfs:
#include<cstdio> #include<queue> #include<cstring> using namespace std; int step[5][5],maze[5][5]; bool vis[5][5]; int dir[4][2]={1,0,-1,0,0,1,0,-1}; struct node{ int x; int y; node(int _x,int _y):x(_x),y(_y){} }; queue<node> q; void bfs(){ node start(0,0); q.push(start); vis[0][0]=true; while(!q.empty()){ node head=q.front(); q.pop(); for(int i=0;i<4;i++){ node next(head.x+dir[i][0],head.y+dir[i][1]); if(next.x<0||next.x>4||next.y<0||next.y>4||(vis[next.x][next.y]==true)||(maze[next.x][next.y]==1)){ continue; } else{ q.push(next); step[next.x][next.y]=step[head.x][head.y]+1; vis[next.x][next.y]=true; } if(next.x==4&&next.y==4) return; } } } int main(){ memset(step,0,sizeof(step)); memset(vis,false,sizeof(vis)); for(int i=0;i<5;i++){ for(int j=0;j<5;j++){ scanf("%d",&maze[i][j]); } } bfs(); int cnt=0; for(int i=0;i<5;i++){ for(int j=0;j<5;j++){ if(step[i][j]==cnt){ printf("(%d, %d)\n",i,j); cnt++; } } } return 0; }
最後讀取路線的時候,因為是從左上到右下,所以循環讀取到第一個符合cnt值的地方就是最佳路徑。
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
if(step[i][j]==cnt){
printf("(%d, %d)\n",i,j);
cnt++;
}
這裏本來我寫的是:
for(int i=0;i<5;i++){ for(int j=0;j<5;j++){ if(step[i][j]==cnt++){ printf("(%d, %d)\n",i,j); }
註意看後發現每次循環後面的寫法都會導致cnt增加,最後結果出錯。
poj 3984