POJ 1178 Camelots(bfs)
来源:互联网 发布:如何恢复航天开票数据 编辑:程序博客网 时间:2024/06/05 13:23
题意:把这些所有的棋子移动到一个点,king可以自己走或者骑马走。
思路:预处理,枚举所有的点作为他们的集合点。。
先计算马走的步数,再计算king到最近马路的步数。
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <queue>#include <cmath>#include <stack>#include <map>using namespace std;const int N = 8;int re[N][N][N][N];queue<int> que;bool inline oor(int x,int y){ if(x<0||x>=8) return false; if(y<0||y>=8) return false; return true;}int dx[] = {-2,-2,-1,-1,1,1,2,2};int dy[] = {1,-1,2,-2,2,-2,1,-1};void mindis(int x,int y){ while(!que.empty()) que.pop(); que.push((x<<5)|y); re[x][y][x][y] = 0; int e,ex,ey,tx,ty; while(!que.empty()) { e = que.front(); que.pop(); ex = e>>5;ey = e&15; for(int i=0;i<8;i++) { tx = ex+dx[i],ty=ey+dy[i]; if((!oor(tx,ty))||(re[x][y][tx][ty]!=-1)) continue; re[x][y][tx][ty] = re[x][y][ex][ey]+1; que.push(tx<<5|ty); } }}void init(){ memset(re,-1,sizeof(re)); for(int i=0;i<N;i++) for(int j=0;j<N;j++) mindis(i,j);}char ch[256];bool visit[8][8];struct nod{ int x,y,dis;};queue <nod> qq;int dxx[]={0,0,1,1,1,-1,-1,-1};int dyy[]={-1,1,-1,0,1,-1,0,1};int kinv[8][8];int oper(int x,int y){ memset(visit,0,sizeof(visit)); visit[x][y] = 1; while(!qq.empty()) qq.pop(); nod e,t; int len = strlen(ch); int ret = 0; for(int i=2;i<len;i+=2) { e.x = ch[i]-'A';e.y= ch[i+1]- '1'; e.dis = re[x][y][e.x][e.y]; qq.push(e); visit[e.x][e.y] = 1; ret+=e.dis; } int tx,ty; while(!qq.empty()) { e = qq.front();qq.pop(); for(int i=0;i<8;i++) { tx=e.x+dx[i],ty=e.y+dy[i]; if((!oor(tx,ty))||visit[tx][ty]||(re[x][y][tx][ty]!=e.dis-1)) continue; t.x = tx,t.y = ty;t.dis=e.dis-1; visit[tx][ty] = 1; qq.push(t); } } while(!que.empty()) que.pop(); que.push((ch[0]-'A')<<5|(ch[1]-'1')); memset(kinv,0,sizeof(kinv)); kinv[ch[0]-'A'][ch[1]-'1'] = 1; while(!que.empty()) { int ee = que.front();que.pop(); int ex = ee>>5,ey = ee&15; if(visit[ex][ey]) { return ret+ kinv[ex][ey] -1; } for(int i=0;i<8;i++) { int tx = ex+dxx[i],ty=ey+dyy[i]; if(!oor(tx,ty)||kinv[tx][ty]) continue; kinv[tx][ty] = kinv[ex][ey]+1; que.push(tx<<5|ty); } } return 100;}void solve(){ int ans = 10000000; for(int i=0;i<8;i++) for(int j=0;j<8;j++) ans = min(ans,oper(i,j)); printf("%d\n",ans);}int main(){ #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif init(); scanf("%s",ch); solve(); return 0;}
- POJ 1178 Camelots(bfs)
- [BFS] poj
- poj 3626 简单bfs
- POJ 3278 : 经典BFS
- poj 3126 简单bfs
- poj 3278 简单bfs
- poj 2243 bfs
- poj 1856 bfs
- POJ 3697 BFS暴力
- POJ 2251 BFS
- poj 3278 bfs
- POJ 3414 Pots BFS
- poj 3278、、、BFS
- poj--2243 BFS
- POJ 1465 Multiple BFS
- bfs poj 2157 maze
- poj 2251 三维BFS
- poj 1979 bfs
- UVA 10285 Longest Run on a Snowboard
- Android Button的点击事件【原创】
- android图片旋转处理
- Android控件系列之RadioButton&RadioGroup
- ARM 位置无关代码(PIC)的分析理解
- POJ 1178 Camelots(bfs)
- Linux下core文件调试方法
- HtmlAgilityPack 爬虫批量获取百度音乐下载地址一
- Search Techniques
- Oracle练习题
- Android开发之旅:环境搭建及HelloWorld
- 【shell】用sed获取最后一个字符
- Android4.1 触摸屏(TP)划线曲折、不圆润的解决方法
- VPS容易被破解3389,分享修改远程登陆的端口号