日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDU 4121 Xiangqi (算是模拟吧)

發布時間:2024/9/5 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 (算是模拟吧)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。