POJ_3009 Curling 2.0

這個題目用的時間有點長,還好一次就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 }
相關文章
相關標籤/搜索