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 |
Re:勉强AC吧 附代码(bfs )In Reply To:勉强AC吧 附代码(bfs ) Posted by:194325 at 2012-10-06 10:11:21 > 一开始看到这题 就想到用广度优先搜索 然后使用优先队列 结果行不通 > 有一组数据通不过 如下 : > 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