您的位置:首页 > 其它

模拟 POJ 1573 Robot Motion

2015-03-27 17:52 471 查看
题目地址:http://poj.org/problem?id=1573

 /*
题意:给定地图和起始位置,robot(上下左右)一步一步去走,问走出地图的步数
如果是死循环,输出走进死循环之前的步数和死循环的步数
模拟题:used记录走过的点,因为路线定死了,所以不是死循环的路只会走一次,可以区分出两个步数

注意:比较坑的是,如果不是死循环,临界(走进去就出来)步数是1;而死循环却是0.        这里WA几次。。。
*/
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <string>
#include <map>
#include <queue>
#include <vector>
using namespace std;

const int MAXN = 20;
const int INF = 0x3f3f3f3f;
int a[MAXN][MAXN];
int used[MAXN][MAXN];

void work(int n, int m, int k)
{
int ans = 0;    int cnt = 0;    int i = 1, j = k;
while (i >= 1 && i <= n && j >= 1 && j <= m)
{
if (used[i][j] <= 2)
{
switch (a[i][j])
{
case 'N': i -= 1; break;
case 'S': i += 1; break;
case 'W': j -= 1; break;
case 'E': j += 1; break;
}
used[i][j]++;
if (used[i][j] == 2)    cnt++;
else    ans++;
}
else
{
int res = ans - cnt;
if (res == 1)        res = 0;
printf ("%d step(s) before a loop of %d step(s)\n", res, cnt);
break;
}
}
if (i < 1 || i > n || j < 1 || j > m)
printf ("%d step(s) to exit\n", ans);
}

int main(void)        //POJ 1573 Robot Motion
{
//freopen ("H.in", "r", stdin);

int n, m, k;
while (~scanf ("%d%d%d", &n, &m, &k) && n && m && k)
{
getchar ();
for (int i=1; i<=n; ++i)
{
for (int j=1; j<=m; ++j)
{
a[i][j] = getchar ();
}
getchar ();
}

memset (used, 0, sizeof (used));
work (n, m, k);
}

return 0;
}

/*
10 step(s) to exit
3 step(s) before a loop of 8 step(s)
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: