大意:
就是要求把一个冰壶从起点“2”用最少的步数移动到终点“3”
其中0为移动区域,1为石头区域,冰壶一旦想着某个方向运动就不会停止,也不会改变方向(想想冰壶在冰上滑动),除非冰壶撞到石头1 或者 到达终点 3
冰壶撞到石头后,冰壶会停在石头前面,此时(静止状态)才允许改变冰壶的运动方向,而该块石头会破裂,石头所在的区域由1变为0. 也就是说,冰壶撞到石头后,并不会取代石头的位置。
终点是一个摩擦力很大的区域,冰壶若到达终点3,就会停止在终点的位置不再移动。
思路:
DFS的水题 中间由于变量初始化放错位置了, WA了好几次。
1 #include <Map> 2 #include <stack> 3 #include <queue> 4 #include <math.h> 5 #include <stdio.h> 6 #include <string.h> 7 #include <iostream> 8 #include <limits.h> 9 #include <algorithm> 10 #define LL long long 11 #define min(a,b) (a>b?b:a) 12 #define max(a,b) (a>b?a:b) 13 #define eps 1e-9 14 #define INF 1 << 30 15 using namespace std; 16 17 int dx[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; 18 19 int Ans = 20; 20 int n, m; 21 int Map[30][30]; 22 int begin_x, begin_y; 23 24 void Dfs(int x, int y, int depth) 25 { 26 int n_x, n_y; 27 if(depth > 10) 28 return ; 29 for(int i = 0; i < 4; i++) 30 { 31 int flag = 0; 32 if(Map[x+dx[i][0]][y+dx[i][1]] == 1) 33 continue; 34 n_x = x; 35 n_y = y; 36 while(1) 37 { 38 n_x += dx[i][0]; 39 n_y += dx[i][1]; 40 if(n_x >= 1 && n_x <= n && n_y >= 1 && n_y <= m) 41 { 42 if(Map[n_x][n_y] == 3) 43 { 44 if(Ans > depth) 45 { 46 Ans = depth; 47 } 48 return ; 49 } 50 else if(Map[n_x][n_y] == 1) 51 { 52 break; 53 } 54 } 55 else 56 { 57 flag = 1; 58 break; 59 } 60 } 61 if(flag == 1) 62 continue; 63 Map[n_x][n_y] = 0; 64 Dfs(n_x-dx[i][0], n_y-dx[i][1], depth+1); 65 Map[n_x][n_y] = 1; 66 } 67 } 68 69 void run() 70 { 71 while(~scanf("%d%d", &m, &n)) 72 { 73 if(!m && !n) 74 break; 75 memset(Map, 0, sizeof(Map)); 76 for(int i = 1; i <= n; i++) 77 { 78 for(int j = 1; j <= m; j++) 79 { 80 scanf("%d", &Map[i][j]); 81 if(Map[i][j] == 2) 82 { 83 begin_x = i; 84 begin_y = j; 85 Map[i][j] = 0; 86 } 87 } 88 } 89 Ans = 500; 90 Dfs(begin_x, begin_y, 1); 91 if(Ans == 500) 92 printf("-1 "); 93 else 94 printf("%d ", Ans); 95 } 96 } 97 98 int main(void) 99 { 100 run(); 101 102 return 0; 103 }