Description:
ZWK很懒每次从某个点到哪个点都会去计算下步数,想知道最短需要多少步,简单的来说就是在一个N*M的矩阵,用‘S’表示起始点,‘E’表示终点,’.‘表示可以走的路,'#'表示障碍,求S到E的最短步数,EOF表示结束
Input:
第一行输入n,m
然后输入N*M矩阵
Output:
输出最短的步数
Sample Input:
3 3 S.. ... ..E
Sample Output:
4// ZWK SO LAZY.cpp : 定义控制台应用程序的入口点。 // #include<stdlib.h> #include<math.h> #include<stdio.h> #define N 105 #define min(x,y) (x<y?x:y) char map[N][N]; int vis[N][N]; int n,m,minz=999999; int step[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; int check(int x,int y) { if((x>=0&&x<n)&&(y>=0&&y<m)) return 1; return 0; } int DFS(int x,int y,int dp) { int i,j; if(map[x][y]=='E') { minz=min(minz,dp); return 1; } for(i=0;i<4;i++) { int tmpx,tmpy; tmpx=x+step[i][0]; tmpy=y+step[i][1]; if(map[tmpx][tmpy]=='#') continue; if(check(x,y)==1&&vis[tmpx][tmpy]==0) { vis[tmpx][tmpy]=1; DFS(tmpx,tmpy,dp+1); vis[tmpx][tmpy]=0; } } return 0; } int main() { int x,y,i,j; while(scanf("%d%d",&n,&m)!=EOF) { x=y=minz=999999; for(i=0;i<n;i++) scanf("%s",map[i]); for(i=0;i<n;i++) for(j=0;j<m;j++) vis[i][j]=0; for(i=0;i<n;i++) { if(x!=minz&&y!=minz) break; for(j=0;j<m;j++) { if(map[i][j]=='S') { x=i,y=j; break; } } } DFS(x,y,0); if(minz==999999) printf("%d\n",0); else printf("%d\n",minz); } return 0; }