题目大意:输入三个整数n,m,k,分别表示在接下来有一个n行m列的地图。一个机器人从第一行的第k列进入。问机器人经过多少步才能出来。如果出现了循环
则输出循环的步数
解题思路:DFS
代码如下(有详细的解释):
/* * 1035_1.cpp * * Created on: 2013年8月17日 * Author: Administrator */ /*简单搜索题,看注释: */ #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cmath> #include<algorithm> using namespace std; /** * map[][] :用来标记地图 * num[x][y] : 用来标记走到(x,y)这个点的时候用了多少步. * 如果num[x][y] == 0,则证明这一步还没走过。否则,根据题意则可能出现了循环 * * n: 行数 * m: 列数 * k: 从第一行的第k列进入地图 * t: 总共走了多少步 * lop: 循环的步数 */ char map[11][11]; int num[11][11]; int n, m, k, lop, t; /** * 判断是否越界 */ bool Overmap(int x, int y) { if (x < 1 || x > n || y < 1 || y > m) { return true; } else { return false; } } void Dfs(int x, int y) { //如果越界了或者是出现了循环 if (Overmap(x, y) || lop > 0) { if (lop > 0) { printf("%d step(s) before a loop of %d step(s) ", t - lop, lop); } else { printf("%d step(s) to exit ", t); } return ; } if (num[x][y] == 0) {//如果这一步还没有走过 num[x][y] = ++t; } else {//判断是否有循环(如果这一步已经走过,则计算循环的步数) lop = t - num[x][y] + 1; }//else //遍历状态 switch(map[x][y]) { case 'N': x--; Dfs(x, y); x++; break; //Dfs最主要:前加的条件,在之后要返回 case 'E': y++; Dfs(x, y); y--; break; case 'S': x++; Dfs(x, y); x--; break; case 'W': y--; Dfs(x, y); y++; break; }//switch }//dfs int main() { while (scanf("%d %d %d", &n, &m, &k) != EOF, n) { memset(map, 0, sizeof(map)); memset(num, 0, sizeof(num)); lop = 0; t = 0; getchar(); for (int i = 1; i <= n; i++) { scanf("%s", map[i] + 1); getchar(); } Dfs(1, k); } }