題目大意:輸入三個整數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)\n", t - lop, lop); } else { printf("%d step(s) to exit\n", 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); } } /* * 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)\n", t - lop, lop); } else { printf("%d step(s) to exit\n", 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); } }