HDU 4121 Xiangqi (算是模拟吧)
生活随笔
收集整理的這篇文章主要介紹了
HDU 4121 Xiangqi (算是模拟吧)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
傳送門:http://acm.hdu.edu.cn/showproblem.php?pid=4121
?
題意:中國象棋對決,黑棋只有一個將,紅棋有一個帥和不定個車 馬 炮冰給定位置,這時當黑棋走,問你黑棋是不是被將死了(當前位置被將,能走得下一步也被將)
題解:代碼里面注釋很詳細,我就不多說了,知道象棋規則的同學基本上都可以做出來
?
AC代碼:
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <cstdlib> #include <cmath> #include <vector> #include <list> #include <deque> #include <queue> #include <iterator> #include <stack> #include <map> #include <set> #include <algorithm> #include <cctype> using namespace std;#define si1(a) scanf("%d",&a) #define si2(a,b) scanf("%d%d",&a,&b) #define sd1(a) scanf("%lf",&a) #define sd2(a,b) scanf("%lf%lf",&a,&b) #define ss1(s) scanf("%s",s) #define pi1(a) printf("%d\n",a) #define pi2(a,b) printf("%d %d\n",a,b) #define mset(a,b) memset(a,b,sizeof(a)) #define forb(i,a,b) for(int i=a;i<b;i++) #define ford(i,a,b) for(int i=a;i<=b;i++)typedef long long LL; const int N=110001; const int M=1000007; const int INF=0x3f3f3f3f; const double PI=acos(-1.0); const double eps=1e-7;char mp[11][11]; int bx,by,n; int tt[4][2]={1,0,-1,0,0,1,0,-1};struct node {int x,y; }pp[11];bool shu(int x1,int x2,int y) {if(x1>x2) swap(x1,x2);int f=0;for(int i=x1+1;i<x2;i++)if(mp[i][y]!='0')f=1;if(f) return false;else return true; }bool heng(int x,int y1,int y2) {if(y1>y2) swap(y1,y2);int f=0;for(int j=y1+1;j<y2;j++)if(mp[x][j]!='0')f=1;if(f) return false;else return true; }bool shuone(int x1,int x2,int y) {if(x1>x2) swap(x1,x2);int f=0;for(int i=x1+1;i<x2;i++)if(mp[i][y]!='0')f++;if(f!=1) return false;else return true; }bool hengone(int x,int y1,int y2) {if(y1>y2) swap(y1,y2);int f=0;for(int j=y1+1;j<y2;j++)if(mp[x][j]!='0')f++;if(f!=1) return false;else return true; }bool jiang(int x,int y) {forb(i,0,n){int rx=pp[i].x,ry=pp[i].y;char c=mp[rx][ry];if(c=='G')//對將的時候,判斷在一列且中間沒有棋子{if(ry==y&&shu(x,rx,y)) return true;}if(c=='R')//車,判斷在一行一列且中間沒有棋子{if(x==rx&&heng(x,y,ry)) return true;if(y==ry&&shu(x,rx,y)) return true;}if(c=='H')//馬,判斷距離為3,且沒有被撇馬腿{if((abs(x-rx)+abs(y-ry))!=3) continue;if(abs(x-rx)==2){if(rx<x&&mp[rx+1][ry]=='0') return true;if(rx>x&&mp[rx-1][ry]=='0') return true;}if(abs(y-ry)==2){if(ry<y&&mp[rx][ry+1]=='0') return true;if(ry>y&&mp[rx][ry-1]=='0') return true;}}if(c=='C')//炮,判斷在一行一列且中間只有一個棋子{if(x==rx&&hengone(x,y,ry)) return true;if(y==ry&&shuone(x,rx,y)) return true;}}return false; }int main() {while(scanf("%d%d%d",&n,&bx,&by)&&(n+bx+by)!=0){memset(mp,'0',sizeof(mp));char c;int x,y;forb(i,0,n){cin>>c>>x>>y;mp[x][y]=c;pp[i].x=x; pp[i].y=y;}if(!jiang(bx,by))//如果開始的時候都不將軍則直接輸出no{printf("NO\n");continue;}int flag=0;forb(i,0,4)//可以向四個方向走{x=bx+tt[i][0];y=by+tt[i][1];if(x>=1&&x<=3&&y>=4&&y<=6)//注意范圍{char c=mp[x][y];//這個地方要注意,如果有棋子的話可以吃,開始的時候我認為有棋子的地方不能走mp[x][y]='0';if(!jiang(x,y))//判斷能不能將軍{flag=1;break;}mp[x][y]=c;//還原}}printf("%s\n",flag?"NO":"YES");}return 0; }
?
?
轉載于:https://www.cnblogs.com/suncoolcat/p/3339653.html
總結
以上是生活随笔為你收集整理的HDU 4121 Xiangqi (算是模拟吧)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL server 2012 如何取上
- 下一篇: C++学习第一天