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 |
勉强AC吧 附代码(bfs )一开始看到这题 就想到用广度优先搜索 然后使用优先队列 结果行不通 有一组数据通不过 如下 : 10 10 X X 7 2 10 6 10 6 7 2 7 2 10 6 0 0 0 0 答案应该都是 2 segments的 结果都成了3 segments 纠结了好久 初步断定是 vis[][]数组那里的问题 奇迹是将它改作普通的队列,竟然AC了 很奇特吧 还有一件事 就是控制方向的那个数组 原来的是 int dir[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};/*上下左右*/ 给WA了 原因还是有一组数据不能通过 如下 7 6 XXXXXXX X X X X X X X X X X XXXXXXX 1 3 7 4 1 4 7 3 1 3 3 1 1 3 4 1 1 3 5 1 1 5 7 5 3 4 5 3 0 0 0 0 其中的 pair 3 pair 4 不能通过 然后改成了 int dir[4][2] = {{0,1},{0,-1},{1,0},{-1,0}}; /* 右左上下 */ 就给AC了 你说奇不奇特 !!!!! 小小滴附一下代码 #include<iostream> #include<cstring> #include<queue> #include<cstdio> using namespace std; int dir[4][2] = {{0,1},{0,-1},{1,0},{-1,0}}; /* 右左上下 */ char map[77][77]; bool vis[77][77]; int x1,y1,x2,y2,w,h; struct Node { int x,y,step,dir; /* x,y代表方向,step走了几步,dir = (0初始状态,1直走,2横走)*/ }; bool operator <(const Node &a,const Node &b) { return a.step > b.step; } int bfs() { memset(vis,0,sizeof(vis)); // priority_queue<Node>q; /* 用优先队列就错了 */ queue<Node>q; Node s,e; s.x = x1; s.y = y1; s.step = 0; s.dir = 0; vis[s.x][s.y] = 1; q.push(s); while(!q.empty()) { //s = q.top(); s = q.front(); q.pop(); for(int i=0;i<4;i++) { e.x = s.x + dir[i][0]; e.y = s.y + dir[i][1]; if(e.x == s.x) e.dir = 2; /* 横 */ else e.dir = 1; /* 竖 */ if(e.x>=0&&e.x<=h+1&&e.y>=0&&e.y<=w+1&&!vis[e.x][e.y]) { if(s.dir == 0) e.step = 1; else { if(s.dir == e.dir) e.step = s.step; else e.step = s.step + 1 ; } if(e.x == x2&&e.y==y2) return e.step; if(map[e.x][e.y] ==' ') { vis[e.x][e.y] = 1; q.push(e); } } } } return false; } int main() { freopen("cs.txt","r",stdin); int i,j,cnt=1,Step; while(cin>>w>>h&&(w||h)) { memset(map,' ',sizeof(map)); for(i=1;i<=h;i++) /* 构建地图 */ { getchar(); for(j=1;j<=w;j++) map[i][j] = getchar(); } printf("Board #%d:\n",cnt++); /* printf("Board #%d:\n",cnt++); */ int count = 1; while(cin>>y1>>x1>>y2>>x2) { if(x1+y1+x2+y2==0) break; printf("Pair %d: ",count++); /* printf("Pair %d: \n",count++); */ Step = bfs(); if(!Step) printf("impossible.\n"); else printf("%d segments.\n",Step); } printf("\n"); } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator