poj3009
1 #include <iostream> 2 3 using namespace std; 4 5 int w, h; 6 int MAP[41][41]; 7 int sx, sy, ex, ey; 8 int res; 9 int dx[4] = { 10 1, -1, 0, 0 11 }; 12 int dy[4] = { 13 0, 0, 1, -1 14 }; 15 16 int runing(int &x, int &y, int dir) 17 { 18 for(;;) 19 { 20 int nx = x + dx[dir]; 21 int ny = y + dy[dir]; 22 if(nx >= 0 && nx < w && ny >= 0 && ny < h) 23 { 24 if(MAP[ny][nx] == 1) 25 { 26 return 1; 27 } 28 else if(nx == ex && ny == ey) 29 { 30 return 0; 31 } 32 } 33 else 34 { 35 return -1; 36 } 37 x = nx; 38 y = ny; 39 } 40 } 41 42 void dfs(int x, int y, int sum) 43 { 44 int nx, ny; 45 //´óÓÚ10£¬¼ôÖ¦ 46 if(sum > 10) 47 return ; 48 49 50 //Ëĸö·½Ïò½øÐÐËÑÑ° 51 for(int i = 0; i < 4; ++i) 52 { 53 nx = x + dx[i]; 54 ny = y + dy[i]; 55 if(nx >= 0 && nx < w && ny >= 0 && ny < h) 56 { 57 if(MAP[ny][nx] == 1) 58 { 59 continue; 60 } 61 } 62 else 63 continue; 64 nx = x; ny = y; 65 int temp = runing(nx, ny, i); 66 //ÍùÕâ¸ö·½ÏòÅöµ½µÄÊÇǽ 67 if(temp == 1) 68 { 69 MAP[ny+dy[i]][nx+dx[i]] = 0; 70 dfs(nx, ny, sum+1); 71 MAP[ny+dy[i]][nx+dx[i]] = 1; 72 73 } 74 //ÍùÕâ¸ö·½Ïò³ö½çÁË 75 else if(temp == -1) 76 { 77 continue; 78 } 79 //ÍùÕâ¸ö·½Ïòµ½´ïÁËÖÕµã 80 else if(temp == 0) 81 { 82 if(res > sum) 83 res = sum; 84 } 85 } 86 87 } 88 89 void solver() 90 { 91 res = 11; 92 dfs(sx, sy, 1); 93 94 } 95 int main() 96 { 97 while(cin >> w >> h) 98 { 99 if(w == 0 && h == 0) 100 break; 101 //input 102 for(int i = 0; i < h; ++i) 103 { 104 for(int j = 0; j < w; ++j) 105 { 106 cin >> MAP[i][j]; 107 if(MAP[i][j] == 2) 108 { 109 sx = j; 110 sy = i; 111 } 112 if(MAP[i][j] == 3) 113 { 114 ex = j; 115 ey = i; 116 } 117 } 118 } 119 //solver 120 solver(); 121 //output 122 if(res > 10) 123 cout << -1 << endl; 124 else 125 cout << res << endl; 126 } 127 128 return 0; 129 }