这几天比较颓= = ~~~~效率几乎为零
原题: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;
}