這個題目用的時間有點長,還好一次就A了。ios
這個題目主要是要理解題目,有如下三點要注意:spa
1.冰壺打到石頭會在旁邊停下來,碰到的這個石頭會碎掉。code
2.停下來的冰壺若是旁邊有石頭是不能往哪一個方向運動的。blog
3.找出起點以後要把起點改爲vacant的,由於冰壺顯然是能夠通過起點的。ci
個人代碼比較長,可是應該比較好理解,分別判斷四個方向的狀況,而不是四個方向一塊兒判斷。input
1 #include<stdio.h> 2 #include<iostream> 3 using namespace std; 4 5 #define MAX 20 6 #define MAX_TRY 10 7 8 9 int board[MAX][MAX]; 10 int result; 11 int end_x,end_y; 12 int w,h; 13 14 int DFS(int x,int y,int time) { 15 if(board[x][y] == 3) return time; 16 if(time >= MAX_TRY) return -1; 17 18 int result_temp = -1; 19 int result_final = 11; 20 21 //left 22 if(y > 0 && board[x][y-1] != 1) 23 for(int i=y-1;i>=0;i--) { 24 if(board[x][i] == 3) 25 return time+1; 26 if(board[x][i] == 1) { 27 board[x][i] = 0; 28 result_temp = DFS(x,i+1,time+1); 29 board[x][i] = 1; 30 if (result_temp != -1 && result_temp < result_final) 31 result_final = result_temp; 32 break; 33 } 34 } 35 36 37 //right 38 if(y < w - 1 && board[x][y+1] != 1) 39 for(int i=y+1;i<=w-1;i++) { 40 if(board[x][i] == 3) 41 42 return time+1; 43 if(board[x][i] == 1) { 44 board[x][i] = 0; 45 result_temp = DFS(x,i-1,time+1); 46 board[x][i] = 1; 47 if(result_temp != -1 && result_temp < result_final) 48 result_final = result_temp; 49 50 break; 51 } 52 } 53 54 //top 55 if(x > 0 && board[x-1][y] != 1) 56 for(int i=x-1;i>=0;i--) { 57 if(board[i][y] == 3) 58 return time+1; 59 60 61 if(board[i][y] == 1) { 62 board[i][y] = 0; 63 result_temp = DFS(i+1,y,time+1); 64 board[i][y] = 1; 65 if(result_temp != -1 && result_temp < result_final) 66 result_final = result_temp; 67 68 break; 69 } 70 } 71 72 //down 73 if(x < h-1 && board[x+1][y] != 1) 74 for(int i=x+1;i<=h-1;i++) { 75 if(board[i][y] == 3) 76 77 return time+1; 78 79 if(board[i][y] == 1) { 80 board[i][y] = 0; 81 result_temp = DFS(i-1,y,time+1); 82 board[i][y] = 1; 83 if(result_temp != -1 && result_temp < result_final) 84 result_final = result_temp; 85 86 break; 87 } 88 } 89 90 if (result_final == 11) 91 result_final = -1; 92 return result_final; 93 } 94 95 96 int main() 97 { 98 int start_x,start_y; 99 while(cin >> w >> h, w && h) { 100 //read input 101 for(int i=0;i<h;i++) { 102 for(int j=0;j<w;j++) { 103 cin>>board[i][j]; 104 105 if(board[i][j] == 2) {start_x = i; start_y = j;board[i][j] = 0;}; 106 107 if(board[i][j] == 3) {end_x = i; end_y = j;}; 108 } 109 } 110 111 112 113 printf("%d\n",DFS(start_x,start_y,0)); 114 115 } 116 return 0; 117 }