2015百度之星资格赛--1005 下棋【双向BFS/找规律】
来源:互联网 发布:java生成soap报文 编辑:程序博客网 时间:2024/06/18 14:50
N∗M N*M的棋盘上有一个受伤的国王与一个要去救援国王的骑士,他们每个单位时间必须同时移动一次寻找对方。如下图所示,黑色的图例表示国王(右)或骑士(左)当前所在的位置,那么灰色的位置表示在一次移动中他们可能到达的位置。国王伤势严重,因此他必须在K个单位时间内得到骑士的救援,否则会挂掉。问国王是否可以在K个单位时间内获得救援,如果可以,最短需要花多少个单位时间。
//双向BFS广搜
#include <queue>#include <cstdio>#include <string>#include <cstring>#include <iostream>#define clr(a,val) memset(a,val,sizeof(a))using namespace std;const int maxn = 1005;const int INF = 0x3f3f3f3f;struct SPoint { int x,y,step;};int N,M,K;SPoint Knight,King,Now,Next;queue<SPoint>Que;int Map_Knight[maxn][maxn],Map_King[maxn][maxn];bool vis[maxn][maxn];const int dirX_Knight[8] = {-1,-2,-2,-1,1,2,2,1};const int dirY_Knight[8] = {-2,-1,1,2,-2,-1,1,2};const int dirX_King [8] = {-1,0,-1,1,-1,1,0,1 };const int dirY_King [8] = {-1,-1,0,1,1,-1,1,0 };bool Over_Bound(const SPoint &p) { return p.x <= 0 || p.y <= 0 || p.x > N || p.y > M;}void BFS_Knight() { clr(vis,false); clr(Map_Knight,-1); while(!Que.empty()) Que.pop(); Que.push(Knight); vis[Knight.x][Knight.y] = true; while(!Que.empty()) { Now = Que.front(); Map_Knight[Now.x][Now.y] = Now.step; for(int i = 0; i < 8; i++) { Next.x = Now.x + dirX_Knight[i]; Next.y = Now.y + dirY_Knight[i]; Next.step = Now.step + 1; //Next.step > K 剪枝处理 if(Over_Bound(Next) || vis[Next.x][Next.y] || Next.step > K) continue; vis[Next.x][Next.y] = true; Que.push(Next); } Que.pop(); }}void BFS_King() { clr(vis,false); clr(Map_King,-1); while(!Que.empty()) Que.pop(); Que.push(King); vis[King.x][King.y] = true; while(!Que.empty()) { Now = Que.front(); Map_King[Now.x][Now.y] = Now.step; for(int i = 0; i < 8; i++) { Next.x = Now.x + dirX_King[i]; Next.y = Now.y + dirY_King[i]; Next.step = Now.step + 1; //Next.step > K 剪枝处理 if(Over_Bound(Next) || vis[Next.x][Next.y] || Next.step > K) continue; vis[Next.x][Next.y] = true; Que.push(Next); } Que.pop(); }}int main() { freopen("F:\\in.dat","r",stdin); int t,cas = 0,ans; cin>>t; while(t--) { cin>>N>>M>>K; cin>>King.x>>King.y; cin>>Knight.x>>Knight.y; King.step = Knight.step = 0; BFS_Knight(); BFS_King(); ans = INF; //初始化为无穷大//关键得好好理解下面的代码~ for(int i = 1; i <= N; i++) { for(int j = 1; j <= M; j++) { int& Step_King = Map_King[i][j], &Step_Knight = Map_Knight[i][j]; if(Step_King == -1 || Step_Knight == -1) continue;//分类的主要依据就是国王的走法和骑士不同//如果国王比骑士先到该点,国王可以现在该点附近转一下,并不影响骑士到达该点的步数~ if(Step_Knight > Step_King) { ans = min(ans, Step_Knight); continue; }//如果国王比骑士到达该点要多走的步数为奇数 if((Step_King - Step_Knight) & 1) { ans = min(ans,Step_King + 1); continue; }//如果国王比骑士到达该点要多走的步数为偶数 ans = min(ans,Step_King); continue; } } printf("Case #%d:\n",++cas); if(ans > K) printf("OH,NO!\n"); else printf("%d\n",ans); } return 0;}
0 0
- 2015百度之星资格赛--1005 下棋【双向BFS/找规律】
- 百度之星资格赛1005 下棋 BFS
- 2015年百度之星程序设计大赛 - 资格赛 1005 下棋
- 百度之星程序设计竞赛资格赛:1005-下棋
- bestCoder 百度之星程序设计资格赛 1005下棋
- 【百度之星资格赛】 下棋(构图)
- 百度之星2015 1005 下棋
- 2015百度之星 下棋
- 2015百度之星资格赛1005
- 2015百度之星资格赛
- 百度之星资格赛
- 百度之星2015资格赛#1002
- 百度之星资格赛2015IP聚合
- 2015百度之星资格赛1003
- 2015百度之星资格赛1001
- 百度之星2015资格赛#1001
- 百度之星2015资格赛#1003
- 2015百度之星资格赛1002
- 解决Xcode断点调试值都为nil的问题
- css3 动画之 2D旋转 3D旋转 放大
- Mac下执行php遇到Allowed memory size of 134217728 bytes exhausted问题解决方法
- Linux软件包安装1
- 数据预处理和weka.filters的使用
- 2015百度之星资格赛--1005 下棋【双向BFS/找规律】
- poj 1258 Agri-Net poj 2485 Highways
- 感悟——毕业一年
- 自定义View(加载Xib方式)
- 黑马程序员——String类,包装类及List,Set集合
- 凯云水利水电工程造价管理系统 技术解析(四)取费管理(一)
- 海马汽车经销商管理系统技术解析(四)新增预约
- 队列(二):顺序存储队列
- 8.17