http://acm.hdu.edu.cn/showproblem.php?pid=4121

几百年前就做过这道题了,没想到坑到这个地步了。。。。。

很简单,就是判断一个黑先手的局面是否checkmate(黑必败局,红必胜终局)

随便秀一下写程序之前的草稿

/*1.黑先红后
2.黑无论,红有胜
3.两种棋子,帅马将    车炮帅
4.检查棋盘合法性  不跃出棋盘
5.独立合法
范围 路径 终点
数组走法路径:
帅将有范围 马的不蹩脚 红的终点不红
飞行路径:
四方扫
红的终点不同红
帅车遇到红-1/+1或者黑为界限
炮隔一个两个为界限
帅同列吃
6.eat检测 有无将
7.一个棋子遗留局面vector
int blockcnt  统计某一个方向有多少个棋子阻碍着
int check(红的不红,帅范围)
vec go()
int solve()
{for 黑子for红子
}*/

View Code

ac代码

#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模拟相关推荐

  1. linux上的中国象棋游戏下载,中国象棋下载_中国象棋最新下载_玩一玩游戏

    中国象棋是起源于中国,的一种棋类游戏,属于两个人之间的对抗,在中国有着悠久的历史.由于它的器皿简单,趣味性强,它已经成为一种非常受欢迎的棋类活动. 中国象棋是中华民族的文化瑰宝,历史悠久,趣味性强,基 ...

  2. Android中国象棋自绘简单实现

    中国象棋(引用自百度百科) 中国象棋是起源于中国的一种棋戏,属于二人对抗性游戏的一种,在中国有着悠久的历史.由于用具简单,趣味性强,成为流行极为广泛的棋艺活动. 中国象棋是中国棋文化也是中华民族的文化 ...

  3. 局域网象棋 Java

    为了学习一下套接字,借鉴老师给出的课题--象棋,我自己用Java写了一个可以局域网对战的象棋,老师当时要求用C++写,完成老师的课题后,我就学着Socket写了一个局域网的,我是从零开始,所以我借鉴了 ...

  4. POJ4001 HDU4121 UVA1589 UVALive5829 Xiangqi【模拟+回溯】

    Xiangqi Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1791   Accepted: 444 Descriptio ...

  5. java通用象棋游戏_在通用国际象棋界面周围模拟GraphQL包装器

    java通用象棋游戏 The Universal Chess Interface (UCI) has been around a long time and used by many chess en ...

  6. 【C语言】模拟实现中国象棋

    基于五子棋框架上的 象棋 小游戏 旧文档:完成于2019.10 ps现在看来还能把界面写更好,但当时都是从零开始的,完成度还不错. 本游戏是上各种水课无聊时的产物...不参考现有游戏从零开始实现各项功 ...

  7. hdu4121 Xiangqi uva1589 Xiangqi (模拟)

    这题去年uva做过,做的我差点把电脑砸了... 现在虽然比那时强点,但还是花了不少时间. 一看见代码长的就不敢打有木有?我已经尽量少用数组下标了,不然代码一片混乱,长代码恐惧症有木有? 进入正题,马最 ...

  8. h5使用canvas模拟制作的中国象棋实现残局走子

    <!DOCTYPE html> <html> <head><meta charset="UTF-8"><meta http-e ...

  9. 用python模拟象棋游戏

    咱们直接进入代码正文 : # 这是一个python实现的象棋游戏 class ChessPiece(object):def __init__(self, color, role):self.color ...

最新文章

  1. 解决Multiple dex files define Lcom/qq/e/ads/ADActivity;
  2. 如何使div填充剩余的水平空间?
  3. python爬虫基本知识_爬虫 (十三) 学习 python 基础知识点的正确姿势 (六)
  4. ECMAScript6入门简介篇
  5. 猜数字(HDU-2178)
  6. ppt恢复保存前的文件_文档忘记保存怎么恢复?断电导致文件丢失如何恢复?
  7. RFID-射频识别技术
  8. 使电动机反转的matlab仿真图,基于simulink的Matlab仿真作业(电气工程专业)2
  9. 输入若干数据,找出最大值输出。(键盘和文件读取)
  10. 修改系统时区 /etc/localtime
  11. 关于滚动条内子控件控制问题
  12. list index out of range错误
  13. 有哪些电容笔值得推荐?值得买的电容笔测评
  14. 艾司博讯:拼多多网店账号出现异常该怎么解决?
  15. 递归判断回文字符串c语言,递归判断字符串是否为回文
  16. 【Antd Design Upload】 antd Upload 上传时只有Uploading状态,无法获取返回的数据
  17. java 输出hello
  18. “Let’s Eat Grandma”:标点符号(句法树)增强语义表达,用于情感分析
  19. 电子学会图形化scratch编程等级考试三级真题答案解析(选择题)2020-12
  20. 计算机应用基础95页自荐信,计算机应用基础自荐书.doc

热门文章

  1. Unity做360度全景预览,效果类似pano2vr导出的效果或720云做的效果
  2. Introduction to Computer Networking学习笔记(十五):Queue Model 包交换中的缓冲模型
  3. MySQL--增删改查
  4. Matlab AppDesigner编程教程第1章——面向对象编程
  5. 控制理论中的几种稳定性
  6. delphi DCC32命令行方式编译delphi工程源码
  7. OpenStack云平台搭建(3) | 部署Glance
  8. Oracle账号被锁定了?the account is locked?解决最多分3步!
  9. connection_reset解决方案
  10. Debian 查看与修改IP,设置多ip,network与networkManager配置