hdu4121 象棋checkmate模拟
http://acm.hdu.edu.cn/showproblem.php?pid=4121
几百年前就做过这道题了,没想到坑到这个地步了。。。。。
很简单,就是判断一个黑先手的局面是否checkmate(黑必败局,红必胜终局)
随便秀一下写程序之前的草稿
![](/assets/blank.gif)
![](/assets/blank.gif)
/*1.黑先红后 2.黑无论,红有胜 3.两种棋子,帅马将 车炮帅 4.检查棋盘合法性 不跃出棋盘 5.独立合法 范围 路径 终点 数组走法路径: 帅将有范围 马的不蹩脚 红的终点不红 飞行路径: 四方扫 红的终点不同红 帅车遇到红-1/+1或者黑为界限 炮隔一个两个为界限 帅同列吃 6.eat检测 有无将 7.一个棋子遗留局面vector int blockcnt 统计某一个方向有多少个棋子阻碍着 int check(红的不红,帅范围) vec go() int solve() {for 黑子for红子 }*/
View Code
ac代码
![](/assets/blank.gif)
![](/assets/blank.gif)
#include<cstdio> #include<cstring> #include<cstdlib> #include<vector> #include<algorithm> #include<functional> #include<iostream> #include<cmath> #include<string> #include<cctype> #include<stack> #include<queue> #include<set> #include<sstream> #include<map> #include<ctime> using namespace std; #define For(i,k,n) for(int i=k;i<=n;i++) #define ForD(i,k,n) for(int i=n;i>=k;i--) #define Lson (x<<1) #define Rson ((x<<1)+1) #define MEM(a) memset(a,0,sizeof(a)); #define NEG(a) memset(a,-1,sizeof(a)); #define FILL(a) memset(a,0x3f,sizeof(a)); #define INF 0x3f3f3f3f #define LLINF 0x3f3f3f3f3f3f3f3f #define ll long long #define print(b,a) cout<<b<<"="<<a<<endl; #define printbin(b,a){int tmp=a;string s;do{s+=tmp%2+'0';tmp/=2;}while(tmp);reverse(s.begin(),s.end());cout<<"bin "<<b<<"="<<s<<endl;} #define printarr(i,a,f,b) {For(i,f,b) printf("%d ",a[i]); printf("\n");}#define bg -1 #define rg 1 #define cr 2 #define cn 3 #define hr 4 struct node {int t[11][10]; }; int check(node nd,int r,int c,int nr,int nc) {if(nd.t[r][c]>0&&nd.t[nr][nc]>0) return 0;else if(nd.t[r][c]==rg&&(nr<=7||nr>=11||nc<=3||nc>=7)) return 0;else if(nd.t[r][c]==bg&&(nr<=0||nr>=4||nc<=3||nc>=7)) return 0;else if(nr<=0||nr>=11||nc<=0||nc>=10) return 0;else return 1; } int blockcnt(node nd,int r,int c,int l,int u,int flg) {if(l>u) swap(l,u);int d=0,cnt=0;if(flg==1) d=(nd.t[u][c]!=0)+(nd.t[l][c]!=0);if(flg==0) d=(nd.t[r][u]!=0)+(nd.t[r][l]!=0);//printf("flg=%d d=%d\n",flg,d); For(k,l,u) {if(flg==0){if(nd.t[r][k]){cnt++;}} else{if(nd.t[k][c]){cnt++;}}}cnt-=d;//printf("r=%d c=%d l=%d u=%d cnt=%d\n",r,c,l,u,cnt);return cnt; } int alive(node nd) {int flg=0;For(i,1,10){For(j,1,9){if(nd.t[i][j]==bg)flg=1;}}return flg; } vector<node>go(node nd,int r,int c) //move i,j {int tp=nd.t[r][c];vector<node>st;if(tp==bg||tp==rg){int d[4][2]={{1,0},{-1,0},{0,1},{0,-1}};For(k,0,3){int nr=r+d[k][0],nc=c+d[k][1];//printf("nr=%d nc=%d\n",nr,nc);if(check(nd,r,c,nr,nc)){node nnd=nd;nnd.t[r][c]=0;nnd.t[nr][nc]=tp;st.push_back(nnd);}}For(nr,1,10){if(nr==r) continue;else{if(nd.t[nr][c]==-tp&&blockcnt(nd,r,c,r,nr,1)==0){node nnd=nd;nnd.t[r][c]=0;nnd.t[nr][c]=tp;st.push_back(nnd);}}}}else if(tp==cr){For(nr,1,10){if(nr==r) continue;if(blockcnt(nd,r,c,r,nr,1)==0&&check(nd,r,c,nr,c)){node nnd=nd;nnd.t[r][c]=0;nnd.t[nr][c]=tp;st.push_back(nnd);}}For(nc,1,9){if(nc==c) continue;if(blockcnt(nd,r,c,c,nc,0)==0&&check(nd,r,c,r,nc)){node nnd=nd;nnd.t[r][c]=0;nnd.t[r][nc]=tp;st.push_back(nnd);}}}else if(tp==cn){For(nr,1,10){if(nr==r) continue;if(((nd.t[nr][c]&&blockcnt(nd,r,c,r,nr,1)==1)||(!nd.t[nr][c]&&blockcnt(nd,r,c,r,nr,1)==0))&&check(nd,r,c,nr,c)){node nnd=nd;nnd.t[r][c]=0;nnd.t[nr][c]=tp;st.push_back(nnd);}}For(nc,1,9){if(nc==c) continue;if(((nd.t[r][nc]&&blockcnt(nd,r,c,c,nc,0)==1)||(!nd.t[r][nc]&&blockcnt(nd,r,c,c,nc,0)==0))&&check(nd,r,c,r,nc)){node nnd=nd;nnd.t[r][c]=0;nnd.t[r][nc]=tp;st.push_back(nnd);}}}else{int d[8][2]={{2,1},{2,-1},{-2,1},{-2,-1},{1,2},{1,-2},{-1,2},{-1,-2}};For(k,0,7){int nr=r+d[k][0],nc=c+d[k][1];if(abs(d[k][0])==2){int nnr=nr-d[k][0]/2;if(nd.t[nnr][c]) continue;}else{int nnc=nc-d[k][1]/2;if(nd.t[r][nnc]) continue;}if(check(nd,r,c,nr,nc)){node nnd=nd;nnd.t[r][c]=0;nnd.t[nr][nc]=tp;st.push_back(nnd);}}}//printf("sz=%d\n",st.size());return st; } int solve(node nd) {int checkmate=1;For(i,1,10){For(j,1,9){if(nd.t[i][j]>=0) continue;vector<node>st=go(nd,i,j);int sz=st.size();For(k,0,sz-1){node _nd=st[k];//printf("father:\n");//For(r,1,10)//printarr(c,st[k].t[r],1,9);int canwin=0;For(_i,1,10){For(_j,1,9){if(nd.t[_i][_j]<=0)continue;vector<node>_st=go(_nd,_i,_j);int _sz=_st.size();For(_k,0,_sz-1){//printf("%d %d son:\n",_i,_j);//For(_r,1,10)//printarr(_c,_st[_k].t[_r],1,9);if(!alive(_st[_k])) canwin=1;}}}if(!canwin)checkmate=0;}}}return checkmate; } int main() {//freopen("in.txt","r",stdin);int N,R,C;while(cin>>N>>R>>C&&!(N==0&&R==0&&C==0)){node init;MEM(init.t);init.t[R][C]=bg;For(i,1,N){char cc;cin>>cc>>R>>C;int tp;if(cc=='G') tp=rg;else if(cc=='R') tp=cr;else if(cc=='C') tp=cn;else tp=hr;init.t[R][C]=tp; }if(solve(init))puts("YES");else puts("NO");}return 0; }
View Code
思路:
go函数返回当前局面可以的下一步局面的集合,check函数专门检查范围性的合法性,棋子特殊合法性由go解决,而棋子合法性中例如炮车需要的监测障碍由blockcnt解决,最后solve针对局面集合判断checkmate。
错误:
但是错误依然很多,于是采用了两两棋子构造简单数据,打印局面,检测各个棋子走法正确性的方法。
犯的错误包括忘记了象棋不吃子和车走法一样,没有考虑棋子不能不走,变量混淆,blockcnt没有考虑我把上下界调整了的情况等等。。。
启示:
启示就是模拟类的:1.打草稿 2.单元测试 3.变量厘清 4.功能分割,要写针对数据和状态的代码,不要写针对路径的代码。
喂 人脑是怎么这么快学会象棋的啊啊啊啊啊啊啊啊,我将个军都写得上气不接下气)
转载于:https://www.cnblogs.com/diang/p/5728330.html
hdu4121 象棋checkmate模拟相关推荐
- linux上的中国象棋游戏下载,中国象棋下载_中国象棋最新下载_玩一玩游戏
中国象棋是起源于中国,的一种棋类游戏,属于两个人之间的对抗,在中国有着悠久的历史.由于它的器皿简单,趣味性强,它已经成为一种非常受欢迎的棋类活动. 中国象棋是中华民族的文化瑰宝,历史悠久,趣味性强,基 ...
- Android中国象棋自绘简单实现
中国象棋(引用自百度百科) 中国象棋是起源于中国的一种棋戏,属于二人对抗性游戏的一种,在中国有着悠久的历史.由于用具简单,趣味性强,成为流行极为广泛的棋艺活动. 中国象棋是中国棋文化也是中华民族的文化 ...
- 局域网象棋 Java
为了学习一下套接字,借鉴老师给出的课题--象棋,我自己用Java写了一个可以局域网对战的象棋,老师当时要求用C++写,完成老师的课题后,我就学着Socket写了一个局域网的,我是从零开始,所以我借鉴了 ...
- POJ4001 HDU4121 UVA1589 UVALive5829 Xiangqi【模拟+回溯】
Xiangqi Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1791 Accepted: 444 Descriptio ...
- java通用象棋游戏_在通用国际象棋界面周围模拟GraphQL包装器
java通用象棋游戏 The Universal Chess Interface (UCI) has been around a long time and used by many chess en ...
- 【C语言】模拟实现中国象棋
基于五子棋框架上的 象棋 小游戏 旧文档:完成于2019.10 ps现在看来还能把界面写更好,但当时都是从零开始的,完成度还不错. 本游戏是上各种水课无聊时的产物...不参考现有游戏从零开始实现各项功 ...
- hdu4121 Xiangqi uva1589 Xiangqi (模拟)
这题去年uva做过,做的我差点把电脑砸了... 现在虽然比那时强点,但还是花了不少时间. 一看见代码长的就不敢打有木有?我已经尽量少用数组下标了,不然代码一片混乱,长代码恐惧症有木有? 进入正题,马最 ...
- h5使用canvas模拟制作的中国象棋实现残局走子
<!DOCTYPE html> <html> <head><meta charset="UTF-8"><meta http-e ...
- 用python模拟象棋游戏
咱们直接进入代码正文 : # 这是一个python实现的象棋游戏 class ChessPiece(object):def __init__(self, color, role):self.color ...
最新文章
- 解决Multiple dex files define Lcom/qq/e/ads/ADActivity;
- 如何使div填充剩余的水平空间?
- python爬虫基本知识_爬虫 (十三) 学习 python 基础知识点的正确姿势 (六)
- ECMAScript6入门简介篇
- 猜数字(HDU-2178)
- ppt恢复保存前的文件_文档忘记保存怎么恢复?断电导致文件丢失如何恢复?
- RFID-射频识别技术
- 使电动机反转的matlab仿真图,基于simulink的Matlab仿真作业(电气工程专业)2
- 输入若干数据,找出最大值输出。(键盘和文件读取)
- 修改系统时区 /etc/localtime
- 关于滚动条内子控件控制问题
- list index out of range错误
- 有哪些电容笔值得推荐?值得买的电容笔测评
- 艾司博讯:拼多多网店账号出现异常该怎么解决?
- 递归判断回文字符串c语言,递归判断字符串是否为回文
- 【Antd Design Upload】 antd Upload 上传时只有Uploading状态,无法获取返回的数据
- java 输出hello
- “Let’s Eat Grandma”:标点符号(句法树)增强语义表达,用于情感分析
- 电子学会图形化scratch编程等级考试三级真题答案解析(选择题)2020-12
- 计算机应用基础95页自荐信,计算机应用基础自荐书.doc
热门文章
- Unity做360度全景预览,效果类似pano2vr导出的效果或720云做的效果
- Introduction to Computer Networking学习笔记(十五):Queue Model 包交换中的缓冲模型
- MySQL--增删改查
- Matlab AppDesigner编程教程第1章——面向对象编程
- 控制理论中的几种稳定性
- delphi DCC32命令行方式编译delphi工程源码
- OpenStack云平台搭建(3) | 部署Glance
- Oracle账号被锁定了?the account is locked?解决最多分3步!
- connection_reset解决方案
- Debian 查看与修改IP,设置多ip,network与networkManager配置