FZU 2180 骑士 (双向BFS)
来源:互联网 发布:投稿软件下载 编辑:程序博客网 时间:2024/06/13 11:25
Description
在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位。在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2,纵坐标相差为1的格子)移动到空位上。
给定一个初始的棋盘,怎样才能经过移动变成如下目标棋盘: 为了体现出骑士精神,他们必须以最少的步数完成任务。
Input
第一行有一个正整数T(T<=10) 表示一共有T组数据 接下来有T个5*5的矩形。0表示白色骑士1表示黑色骑士,*表示空位。(每组数据间有空行)
Output
对每组数据都输出一行。如果能在15不以内(包括15)到达目标状态,则输出步数,否则输出“Bored!”没有引号。
Sample Input
2
10110
01*11
10111
01001
00000
01011
110*1
01110
01010
00100
10110
01*11
10111
01001
00000
01011
110*1
01110
01010
00100
Sample Output
7
Bored!
Bored!
分析:我写的是双向BFS,在bfs过程中如何查找一个矩阵有没有出现过喃?最容易想到的就是矩阵hash+map轻松解决,但是由于此题矩阵大小为5*5,最多25,我们可以换个方法,我们首先把整个矩阵编号,上到下左到右依次从0开始编号,记(i,j)位置编号为id[i][j]。我们另开一个变量state=0,如果图中(i,j)位置为“1”,那么state | = (1<<id[i][j]);如果图不同那么state就不同,但是别忘了图中还有空位,即“*”,所以我们还需要一个变量pos记录这个“*”位置的编号,然后就可以根据state与pos决定两个图是不是一样了,用map+pair查找就行了
#include<stdio.h>#include<string.h>#include<map>#include<queue>#include<algorithm>#define inf 1e8using namespace std;char a[10][10]={"11111","01111","00*11","00001","00000"};char b[10][10];int state1,pos1,state2,pos2;struct node{ int state;///图中“1”分布的状态 int pos;///“*”的位置编号 int dis;///步数};int id[10][10];///记录个点编号const int f[8][2]={1,-2,1,2,2,1,2,-1,-1,2,-1,-2,-2,1,-2,-1};int bfs(){ queue<node> q1,q2; map<pair<int,int>,int> m1,m2;///map映射的是步数 pair<int,int> p1,p2; node now1,next1; node now2,next2; ///正向 now1.state=state1; now1.pos=pos1; now1.dis=1; q1.push(now1); p1=make_pair(state1,pos1); m1[p1]=1; ///逆向 now2.state=state2; now2.pos=pos2; now2.dis=1; q2.push(now2); p2=make_pair(state2,pos2); m2[p2]=1; if(state1==state2&&pos1==pos2) return 0;///一开始就是答案,输出0 while(q1.size()&&q2.size()) { ///正向 now1=q1.front(); q1.pop(); if(now1.dis>=9) return -1; int x,y;///将pos还原成坐标 x=now1.pos/5; y=now1.pos%5; for(int i=0;i<8;i++) { int mx=x+f[i][0]; int my=y+f[i][1]; if(mx<0||mx>=5||my<0||my>=5) continue; ///接下来将‘*’与(mx,my)处的值交换 next1.pos=id[mx][my]; next1.dis=now1.dis+1; next1.state=now1.state;///暂且存下来等待交换 if(now1.state&(1<<id[mx][my]))///该位置为1(为0就不管state,因为不会改变图中“1”的分布情况) { next1.state|=(1<<id[x][y]);///将1交换到(x,y)处 next1.state^=(1<<id[mx][my]);///由于(mx,my)处被换成了‘*’,所以该地方的1要清掉 } p1=make_pair(next1.state,next1.pos); if(m1.find(p1)==m1.end())///用find高效很多,如果该处写成if(!m1[p1]) 会慢很多,因为map非法查询会多内存,会变很慢 { if(m2.find(p1)!=m2.end()) return next1.dis+m2[p1]-2; m1[p1]=next1.dis; q1.push(next1); } } ///逆向 now2=q2.front(); q2.pop(); if(now2.dis>=8) return -1; x=now2.pos/5; y=now2.pos%5; for(int i=0;i<8;i++) { int mx=x+f[i][0]; int my=y+f[i][1]; if(mx<0||mx>=5||my<0||my>=5) continue; next2.pos=id[mx][my]; next2.dis=now2.dis+1; next2.state=now2.state; if(now2.state&(1<<id[mx][my])) { next2.state|=(1<<id[x][y]); next2.state^=(1<<id[mx][my]); } p2=make_pair(next2.state,next2.pos); if(m2.find(p2)==m2.end()) { if(m1.find(p2)!=m1.end()) return next2.dis+m1[p2]-2; m2[p2]=next2.dis; q2.push(next2); } } } return -1;}void init(){ int num=0; for(int i=0;i<5;i++) for(int j=0;j<5;j++) id[i][j]=num++; state1=0; for(int i=0;i<5;i++) for(int j=0;j<5;j++) { if(a[i][j]=='1') state1|=(1<<id[i][j]); if(a[i][j]=='*') pos1=id[i][j]; }}int main(){ init();///初始的图是不会变的,预先处理就行 int T; scanf("%d",&T); while(T--) { state2=0; for(int i=0;i<5;i++) { scanf("%s",b[i]); for(int j=0;j<5;j++) { if(b[i][j]=='1') state2|=(1<<id[i][j]); if(b[i][j]=='*') pos2=id[i][j]; } } int res=bfs(); if(res==-1||res>15) puts("Bored!"); else printf("%d\n",res); } return 0;}
1 0
- FZU 2180 骑士 (双向BFS)
- FZU 2180 骑士 (双向BFS)
- FZU 2180 骑士 双向BFS
- FZU 2180 双向BFS
- FZU 2150 Fire Game(双向BFS)
- FZU-2150---Fire Game (双向bfs)
- fzu 2196 Escape 双向bfs
- FZU escape(两个bfs)
- FZU 2150(DFS+BFS)
- FZU 2124 吃豆人(BFS)
- 双向BFS(转)
- hdu3085(双向BFS)
- BFS(广搜) 骑士旅行
- BFS:HDU3085-Nightmare Ⅱ(双向BFS)
- BZOJ1671 骑士-bfs
- 骑士问题-BFS求解
- FZU - 2150 Fire Game(bfs)
- 【Fzu】2150 Fire Game(BFS)
- Mysql学习笔记
- CoreText
- R生成颜色PDF
- 利用JSON数据批量操作数据库(插入、更新)
- jsp中的${}
- FZU 2180 骑士 (双向BFS)
- 解决ListView setOnItemLongClickListener 长按无响应(嵌套GridView)
- 98. Validate Binary Search Tree
- 【9204】第k小整数
- mysql 锁超时定位与分析
- Ubuntu12.10中打开Qt creator,提示无法覆盖文件 /home/xxx/.config/Nokia/qtversion.xml : Permission denied解决办法
- “爱运动管理系统”诞生记(9)
- android xml解析
- iOS折线图实现(一)