这几天比较颓= = ~~~~效率几乎为零
原题:http://acm.hdu.edu.cn/showproblem.php?pid=1035
题意:
一个迷宫每个格子都有{W(左走),E(右走),S(下走),N(上走)}中的一个字符,表示下一步行走方向;
输入:
迷宫的 纵向长度m和横向长度n 以及 起点:[0][x];
输出如果能走出去输出:
(ans) step(s) to exit; 如果出不去 存在循环输出(几步之后)step(s) before a loop of (几个格子的循环) step(s)我能想到的是写个递归……应该是……map[][]构造迷宫;visit[][]记录是否被访问;然后两个变量,一个记录步数(有循环则为进入循环前的),一个记录循环长度(若为0则不输出)(人太颓了,回来贴代码- - ,先去睡会儿++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#include<iostream> #include<cstring> #include<cstdio> using namespace std; char map[15][15]; int vis[15][15]; int r,c,st; int loop,step; int dfs(int x,int y,int num) { if(x>r||x<1||y<1||y>c) { cout<<num-1<<" step(s) to exit"<<endl; return 0; } if(vis[x][y]) { cout<<vis[x][y]-1<<" step(s) before a loop of "; return 1; } vis[x][y]=num; if(map[x][y]=='N') { if(dfs(x-1,y,num+1)==1) cout<<vis[x][y]-vis[x-1][y]+1<<" step(s)"<<endl; } else if(map[x][y]=='S') { if(dfs(x+1,y,num+1)==1) cout<<vis[x][y]-vis[x+1][y]+1<<" step(s)"<<endl; } else if(map[x][y]=='E') { if(dfs(x,y+1,num+1)==1) cout<<vis[x][y]-vis[x][y+1]+1<<" step(s)"<<endl; } else { if(dfs(x,y-1,num+1)==1) cout<<vis[x][y]-vis[x][y-1]+1<<" step(s)"<<endl; } return 0; } int main() { while(cin>>r>>c>>st,r&&c) { memset(vis,0,sizeof(vis)); for(int i=1;i<=r;i++) for(int j=1;j<=c;j++) cin>>map[i][j]; dfs(1,st,1); } return 0; }