hdu   1680   Cheesy Chess           题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1680

题目大意:(好长的题啊……先赞一个!)二人对弈,白先黑后,棋盘固定8*8,白黑双方各执一子,白子曰白王(White King),黑子曰黑卒(Black Pawn)。棋盘上除了空格区域"."外还有两种区域,一种是D(Dangerous),另一种是F(Forbidden),规定F区两种棋都不能进入,D区只有白棋不能进入。再来说一下走法,白棋可以往邻接的8个方向走,而黑棋只能往正下方一个方向走。求哪一方赢并输出,所以要说一下胜利标准,白棋的目标是要抓到黑棋,如果白棋走到黑棋占据的格子里,白棋就赢了;任意一方如果走投无路了(轮到它走但它没法走了)另一方就赢了,如果黑棋已经走到最底层又轮到它走了,黑棋就赢了。还有一个比较有意思的point,黑棋的左下和右下两个格子总有两块D(卒前侍卫),它们是跟着黑棋走的。

题目分析:(在此提醒白先黑后,一步一步走)读懂题意其实就胜利了30%了,首先确定用BFS,然后分析一下胜利条件里的“走投无路”,只要白棋不是初始点周围围了8个不可走区域,它就不可能走投无路;黑棋的情况稍微复杂,如果黑棋的下方是F或白棋,黑棋就走投无路了。另外注意一下坑跌的输入,白棋和黑棋的位置输入之后要记得处理一下的。分析就到此为止了。

实现思路:说一下我是怎么实现的。以白棋为起点开始BFS,黑棋的当前位置x是黑棋的初始位置x+白棋的当前步数-1,y总是不变的,两个“卒前侍卫”的位置也容易推。剩下的都在代码里了。

code:

#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
char map[10][10],vis[10][10][10];
int px,py,dir[8][2]= {1,0,-1,0,0,1,0,-1,1,1,1,-1,-1,1,-1,-1};
struct node
{int x,y,step;
}first,next;
bool judge(node a)
{if(a.x==px+a.step&&(a.y==py+1||a.y==py-1))return false;if(map[a.x][a.y]=='F'||map[a.x][a.y]=='D')return false;return a.x>=0&&a.y>=0&&a.x<8&&a.y<8&&!vis[a.x][a.y][a.step];
}
bool bfs(int kx,int ky)
{queue<node>q;vis[kx][ky][0]=true;first.x=kx,first.y=ky,first.step=0;q.push(first);while(!q.empty()){//printf("白在:%d,%d,step==%d\n",first.x,first.y,first.step);first=q.front();q.pop();if(map[px+first.step][py]=='F'){//printf("黑被挡住了\n");return true;}if(px+first.step>7){//printf("黑到底了\n");return false;}for(int i=0; i<8; i++){next.x=first.x+dir[i][0];next.y=first.y+dir[i][1];next.step=first.step+1;if(judge(next)){vis[next.x][next.y][next.step]=true;if(next.x==px+first.step&&next.y==py||next.x==px+next.step&&next.y==py){//黑被抓住||黑被白堵死而走投无路//printf("黑%d,%d被抓住了,%d,%d\n",px+first.step,py,first.x,first.y);return true;}q.push(next);}}}//printf("over\n");return false;
}
int main()
{int i,kx,ky,t;//freopen("1.txt","r",stdin);scanf("%d",&t);while(t--){memset(vis,false,sizeof(vis));for(i=0; i<8; i++){scanf("%s",map[i]);}scanf("%d%d",&kx,&ky);scanf("%d%d",&px,&py);i=8-py;py=px-1;px=i;//printf("kx==%d,ky==%d,px==%d,py==%d\n",8-ky,kx-1,px,py);if(bfs(8-ky,kx-1))printf("White\n");else printf("Black\n");}return 0;
}

PS:好艰辛啊,被黑棋被白棋堵死这一种情况wrong了n+1次……

hdu 1680 Cheesy Chess相关推荐

  1. hdu 1524 A Chess Game

    http://acm.hdu.edu.cn/showproblem.php?pid=1524 博弈  用SG处理 #include<iostream> #include<cstdio ...

  2. HDU 4405 Aeroplane chess(期望DP)

    题目链接 理解了过程就是个水题,收拾东西回家. 1 #include <cstdio> 2 #include <iostream> 3 #include <cstring ...

  3. HDU - 3026 Chinese Chess(二分图的必经边)

    题目链接:点击查看 题目大意:给出一个n*m的棋盘,现在开始放 '车' 棋子,规定只有k个位置可以摆放棋子,现在要求摆放的棋子尽可能多且不能互相攻击,到此为止是一个经典的二分图最大匹配问题,接下来是要 ...

  4. hdu 1524 A Chess Game 博弈

    题目链接 给出一个有向无环图, 上面放有一些棋子, 两个人轮流移动棋子, 当一个人无法移动时, 算输. 求出每一个点的sg值, 异或就可以.出度为0的点sg值为0. 1 #include<bit ...

  5. 【原创】概率DP总结 by kuangbin

    概率DP主要用于求解期望.概率等题目. 转移方程有时候比较灵活. 一般求概率是正推,求期望是逆推.通过题目可以体会到这点. 首先先推荐几篇参考的论文: <信息学竞赛中概率问题求解初探> & ...

  6. 动态规划总结与题目分类

    源博客链接:http://blog.csdn.net/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少 ...

  7. 『ACM-算法-动态规划』初识DP动态规划算法

    一.多阶段决策过程的最优化问题 在现实生活中,有类活 动的过程,由于 它的特殊性,可将过程分成若干个互相阶段.在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果.当阶段决策的选取不是任意确 ...

  8. (转)dp动态规划分类详解

    dp动态规划分类详解 转自:http://blog.csdn.NET/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间 ...

  9. 杭电OJ分类题目(3)

    原题出处:HDOJ Problem Index by Type,http://acm.hdu.edu.cn/typeclass.php 杭电OJ分类题目(3) HDU Computational Ge ...

最新文章

  1. MPB:南农成艳芬组-​瘤胃厌氧真菌代谢产物的检测方法
  2. c#中使用消息循环机制发送接收字符串的方法和数据类型转换
  3. Cocos2d-JS项目之三:使用合图
  4. Atitit 提升稳定性 数据库死锁 目录 1.1. 配置数据库死锁检测超时时间从默认50s到10s 1 1.2. 调整隔离级别到read commit 1 1.3. mysql数据库连接使用完毕
  5. 发票软件怎么测试打印机,(发票打印机问题检测流程手册.doc
  6. maya中英文对比_[转载]maya中英文对照
  7. 学习笔记13--基于蜂窝移动通信的车联网技术
  8. html修改文本框样式,HTML实用文本框样式
  9. OSEK直接网络管理软件开发
  10. setenv设置环境变量_setenv命令教程在Linux中添加,删除和更改环境变量
  11. 如何用 VS Code remote 插件编辑远程 linux 服务器上的文件
  12. Linux中父子进程、兄弟子进程之间通信方式--匿名管道pipe(适用于有血缘关系的进程)
  13. 怎样重启Gunicorn
  14. 布斯(Booth)乘法
  15. 单元测试中的打桩技术
  16. 开发App,如何更好的进行技术选型
  17. linux lvm 8e下继续划分分区,linux下LVM学习_逻辑卷管理
  18. 论爱迪生和特斯拉的直流交流电之争
  19. ros构建机器人运动学模型_ROS机器人底盘(4)-3D仿真模型
  20. 银河英雄传说————牛客

热门文章

  1. 用PowerPoint(PPT)快速制作炫酷数字倒计时
  2. 最新:GoDadddy注册的域名,如何将域名解析设置到腾讯邮箱(MX记录)
  3. gabor 变换matlab,Gabor变换到底是什么鬼?
  4. 调用系统safair 在模拟器下无法成功
  5. 魔芋粉的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  6. 【案例】这些日赚上万美金Youtube油管从业者 技术人的福音
  7. 苹果截屏快捷键_MacOS截屏的那些事儿
  8. Unittest-单元测试3
  9. 三色球问题python_零基础入门学习Python习题3【输密码+水仙花数+摸三色球】
  10. 32.【C/C++ 结构体全类型 (详解)】