标签:dfs
背景:dfs,再加点模拟,各种代码疏漏错误wa了三次!!也有变量名使用不规则照成的。比如临时变量我我就应该用temp,buffer,key,三个变量名来表示。
思路:每一个点四个方向的dfs,到达终点就判断最少步数。
bfs的思路:这个是经典的最短路问题,但是缺点是,地图会改变而bfs没办法像dfs那样容易回溯,方法就是把地图直接放在每一个坐标上,也就是定义一个结构体:
struct place{ int x,y,step; int diagram[M][M];//每一个坐标点都付一个图 }
我的代码:
#include<queue> #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include <iostream> #define LL long long int #define INF 0x3fffffff #define M 29 using namespace std; int n,m,diagram[M][M],ans; struct place{int x,y,step;}s,temp1; void dfs(place temp){ #ifdef Ms for(int i=1;i <= n;i++){ for(int j=1;j <= m;j++){ printf("%d ",diagram[i][j]); } printf("\n"); } printf("\n"); #endif // LOCAL if(temp.step+1 > 10 || temp.step+1 > ans) return; for(int i=temp.x-1;i > 0;i--){//向上走。 if(diagram[i][temp.y] == 3 && diagram[temp.x-1][temp.y] != 1){if(temp.step+1 < ans) ans=temp.step+1;return;} if(diagram[i][temp.y] == 1 && diagram[temp.x-1][temp.y] != 1){ temp1.x=i+1; temp1.y=temp.y; temp1.step=temp.step+1; diagram[i][temp.y]=0; dfs(temp1); diagram[i][temp.y]=1; break; } } for(int i=temp.x+1;i <= n;i++){//向下走。 if(diagram[i][temp.y] == 3 && diagram[temp.x+1][temp.y] != 1){if(temp.step+1 < ans) ans=temp.step+1;return;} if(diagram[i][temp.y] == 1 && diagram[temp.x+1][temp.y] != 1){ temp1.x=i-1; temp1.y=temp.y; temp1.step=temp.step+1; diagram[i][temp.y]=0; dfs(temp1); diagram[i][temp.y]=1; break; } } for(int i=temp.y+1;i <= m;i++){//向右走。 if(diagram[temp.x][i] == 3 && diagram[temp.x][temp.y+1] != 1){if(temp.step+1 < ans) ans=temp.step+1;return;} if(diagram[temp.x][i] == 1 && diagram[temp.x][temp.y+1] != 1){ temp1.x=temp.x; temp1.y=i-1; temp1.step=temp.step+1; diagram[temp.x][i]=0; dfs(temp1); diagram[temp.x][i]=1; break; } } for(int i=temp.y-1;i > 0;i--){//向左走。 if(diagram[temp.x][i] == 3 && diagram[temp.x][temp.y-1] != 1){if(temp.step+1 < ans) ans=temp.step+1;return;} if(diagram[temp.x][i] == 1 && diagram[temp.x][temp.y-1] != 1){ temp1.x=temp.x; temp1.y=i+1; temp1.step=temp.step+1; diagram[temp.x][i]=0; dfs(temp1); diagram[temp.x][i]=1; break; } } } int main(void){ while(scanf("%d%d",&m,&n),m*m+n*n){ memset(diagram,0,sizeof(diagram)); for(int i=1;i <= n;i++) for(int j=1;j <= m;j++){ scanf("%d",&diagram[i][j]); if(diagram[i][j] == 2){ s.x=i; s.y=j; diagram[i][j]=0; } } ans=INF; s.step=0; dfs(s); if(ans == INF) printf("-1\n"); else printf("%d\n",ans); } return 0; }
标签:dfs
原文地址:http://blog.csdn.net/jibancanyang/article/details/44682057