题目来源:hdu 1035
题意
给出一个N*M地图,地图上表明了方向(N上S下W左E右),机器人从第一行第start列开始按照地图方向走:
若能走出地图,输出直到走出地图所用的步数,后接“step(s) to exit”
若不能走出地图(走进了一个死循环),输出走进循环之前的步数a,以及循环的步数b。输出格式“a step(s) before a loop of b step(s)”
以0 0 0结束输入
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n, m, scol;
const int maxn = 12;
const int maxm = 12;
char a[maxn][maxm];
int dir[4][2] = {{-1, 0}, {1, 0}, {0, 1}, {0, -1}};
bool vis[maxn][maxm] = {false};
struct node
{
int row;
int col;
int step;
};
vector<node> v;
int change(char c)
{
if (c == 'N')
{
return 0;
}
else if (c == 'S')
{
return 1;
}
else if (c == 'E')
{
return 2;
}
else
{
return 3;
}
}
void DFS(int x, int y, int step)
{
if (x == 0 || x == n + 1 || y == 0 || y == m + 1)
{
cout << step - 1 << " step(s) to exit" << endl;
return;
}
vis[x][y] = true;
int nx = x + dir[change(a[x][y])][0];
int ny = y + dir[change(a[x][y])][1];
if (vis[nx][ny] == false)
{
node temp;
temp.row = nx;
temp.col = ny;
temp.step = step + 1;
v.push_back(temp);
DFS(nx, ny, step + 1);
}
else
{
int temp = -1;
for (int i = 0; i < v.size(); i++)
{
if (v[i].row == nx && v[i].col == ny)
{
temp = v[i].step;
break;
}
}
cout << temp - 1 << " step(s) before a loop of " << step - temp + 1 << " step(s)" << endl;
return;
}
}
int main()
{
while (cin >> n >> m >> scol && n && m)
{
fill(a[0], a[0] + maxn* maxm, '0');
fill(vis[0], vis[0] + maxn * maxm, false);
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
cin >> a[i][j];
}
}
node temp;
temp.row = 1;
temp.col = scol;
temp.step = 1;
v.push_back(temp);
DFS(1, scol, 1);
v.clear();
}
return 0;
}