Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
BFS 应该没问题 只是要稍微注意下几个问题!BFS的时候 是一整行或者一整列 而不是一个点一个点 例如: x2Txxxxxx x2xxxxx2x 22212222x x2x1xxx2x x2x1xxx2x 111S1111x xxx1xxx2x xxx1xxx2x xxxxxxx2x xxxxxxxxx 第一次 BFS 进队列的时候 是S的一个十字叉上的所有元素 标记1的部分 第二次 BFS 出队列元素是1 进队列的元素是元素1左右的元素(标记有方向 前后的元素不管) 进队列后的元素标记是2 最后2的出列 找到T(答案是3) #include<iostream> #include <queue> using namespace std; int w, h; char game[100][100]; int add[4][2]={{-1, 0}, {0, 1}, {1, 0}, {0, -1}}; int visit[101][101]; int sx, sy, tx, ty; struct NODE { int x, y, ans, d; }; bool check(int x, int y) { if (x > h+1 || x < 0 || y > w+1 || y < 0 ) return false; return true; } int bfs(int sx, int sy, int tx, int ty) { queue<NODE> q; NODE node; int x, y; for (int i = 0; i < 4; i++) { x = sx+add[i][0]; y = sy+add[i][1]; while (check(x, y)) { if (x == tx && y == ty) return 1; if (game[x][y] != 'X') { visit[x][y] = 1; node.x = x; node.y = y; node.ans = 1; node .d = i; q.push(node); } else break; x = x+add[i][0]; y = y+add[i][1]; } } while (!q.empty()) { int _x = q.front().x; int _y = q.front().y; int _d = q.front().d; int _ans = q.front().ans; q.pop(); int d = (_d+1)%4; x = _x+add[d][0]; y = _y+add[d][1]; while (check(x, y)) { if (x == tx && y == ty) return _ans+1; if (game[x][y] == 'X') break; if (visit[x][y] == 0) { visit[x][y] = 1; node.x = x; node.y = y; node.ans = _ans+1; node .d = d; q.push(node); } x = x+add[d][0]; y = y+add[d][1]; } d = (_d-1+4)%4; x = _x+add[d][0]; y = _y+add[d][1]; while (check(x, y)) { if (x == tx && y == ty) return _ans+1; if (game[x][y] == 'X') break; if (visit[x][y] == 0) { visit[x][y] = 1; node.x = x; node.y = y; node.ans = _ans+1; node .d = d; q.push(node); } x = x+add[d][0]; y = y+add[d][1]; } } return -1; } int main() { freopen("test.txt", "r", stdin); int t = 1; int k = 1; while (true) { memset(game, 0, sizeof (game)); k = 1; cin>>w>>h; if (w+h == 0) break; char c; gets(&c); for (int i = 1; i <= h; i++) gets(game[i]+1); cout<<"Board #"<<t++<<":"<<endl; while (true) { memset(visit, 0, sizeof(visit)); cin>>sx>>sy>>tx>>ty; if (sx+sy+tx+ty == 0) break; swap(sx, sy); swap(tx, ty); int ans = bfs(sx, sy, tx, ty); if (ans == -1) cout<<"Pair "<<k++<<": impossible."<<endl; else cout<<"Pair "<<k++<<": "<<ans<<" segments."<<endl; } cout<<endl; } } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator