首页 > 代码库 > poj 3083
poj 3083
1 #include <iostream> 2 #include <limits> 3 #include <queue> 4 using namespace std; 5 6 typedef pair<int, int> P; 7 8 char maze[41][41]; 9 int dist[41][41]; 10 int spDirX[4] = {1, 0, -1, 0}; 11 int spDirY[4] = {0, 1, 0, -1}; 12 int n; 13 int w, h; 14 int startX, startY; 15 int endX, endY; 16 const int INF = numeric_limits<int>::max(); 17 int sp, lo, ro; 18 int dx[4] = { 19 0, 1, 0, -1 20 }; 21 int dy[4] = { 22 -1, 0, 1, 0 23 }; 24 void leftOrder(int x, int y, int sum, int dir) 25 { 26 //ÖÕÖ¹ 27 if(x == endX && y == endY) 28 { 29 lo = sum; 30 return ; 31 } 32 //µÚÒ»¸öÔªËØÈ·¶¨·½Ïò 33 if(sum == 1) 34 { 35 for(int i = 0; i < 4; ++i) 36 { 37 int nx = x + dx[i]; 38 int ny = y + dy[i]; 39 if(nx >= 0 && nx < w && ny >= 0 && ny < h && maze[ny][nx] == ‘.‘) 40 { 41 leftOrder(nx, ny , sum+1, i); 42 break; 43 } 44 45 } 46 } 47 else 48 { 49 //Ò»°ãÇé¿ö 50 dir = (dir+3) % 4; 51 for(int i = 0; i < 4; ++i) 52 { 53 int nx = x + dx[(dir+i)%4]; 54 int ny = y + dy[(dir+i)%4]; 55 if(nx >= 0 && nx < w && ny >= 0 && ny < h && maze[ny][nx] != ‘#‘) 56 { 57 leftOrder(nx, ny , sum+1, (dir+i)%4); 58 break; 59 } 60 } 61 } 62 63 } 64 65 void rightOrder(int x, int y, int sum, int dir) 66 { 67 //ÖÕÖ¹ 68 if(x == endX && y == endY) 69 { 70 ro = sum; 71 return ; 72 } 73 //µÚÒ»¸öÔªËØÈ·¶¨·½Ïò 74 if(sum == 1) 75 { 76 for(int i = 0; i < 4; ++i) 77 { 78 int nx = x + dx[i]; 79 int ny = y + dy[i]; 80 if(nx >= 0 && nx < w && ny >= 0 && ny < h && maze[ny][nx] == ‘.‘) 81 { 82 rightOrder(nx, ny , sum+1, i); 83 break; 84 } 85 86 } 87 } 88 else 89 { 90 //Ò»°ãÇé¿ö 91 dir = (dir+1) % 4; 92 for(int i = 0; i < 4; ++i) 93 { 94 int nx = x + dx[(dir-i+4)%4]; 95 int ny = y + dy[(dir-i+4)%4]; 96 if(nx >= 0 && nx < w && ny >= 0 && ny < h && maze[ny][nx] != ‘#‘) 97 { 98 rightOrder(nx, ny , sum+1, (dir-i+4)%4); 99 break;100 } 101 } 102 }103 104 } 105 106 int shortPath()107 {108 queue<P> que; 109 dist[startY][startX] = 1;110 que.push(P(startX, startY));111 while(que.size())112 {113 P temp = que.front();114 que.pop();115 if(temp.first == endX && temp.second == endY)116 break;117 for(int i = 0; i < 4; ++i)118 {119 int nx = temp.first + spDirX[i];120 int ny = temp.second + spDirY[i];121 if(nx >= 0 && ny >= 0 && nx < w && ny < h && dist[ny][nx] == INF && maze[ny][nx] != ‘#‘)122 {123 que.push(P(nx, ny));124 dist[ny][nx] = dist[temp.second][temp.first] + 1;125 }126 } 127 }128 sp = dist[endY][endX];129 }130 131 132 int main()133 {134 cin >> n;135 for(int i = 0; i < n; ++i)136 {137 cin >> w >> h;138 for(int j = 0; j < h; ++j)139 {140 for(int k = 0; k < w; ++k)141 {142 cin >> maze[j][k];143 dist[j][k] = INF;144 if(maze[j][k] == ‘S‘)145 {146 startX = k;147 startY = j;148 }149 if(maze[j][k] == ‘E‘)150 {151 endX = k;152 endY = j;153 } 154 }155 }156 leftOrder(startX, startY, 1, 0);157 rightOrder(startX, startY, 1, 0);158 shortPath(); 159 cout << lo << " " << ro << " " << sp << endl; 160 }161 return 0;162 }
poj 3083
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。