题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=103455#problem/A
题目大意:判断是否将死黑棋
题目分析:模拟题,不难,记录下被将的位置,判断将移动位置是否全被将,但是细节注意较多,wa了很多次。
注意要点:1.将和帅直接对位,红棋直接输,故输出NO。 2.如果某被将位置有棋,也应判断被将,因为将可能把该棋吃掉。3.先全记录下棋子位置,再进行判断。(这里挖了很多次)
AC代码:
#include<stdio.h>
#include<cstring>
#include<string>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
int gx[5]={0,0,0,-1,1},gy[5]={0,1,-1,0,0};
int hx[9]={0,2,2,1,1,-1,-1,-2,-2},hy[9]={0,1,-1,2,-2,2,-2,1,-1};
int tx[9]={0,1,1,0,0,0,0,-1,-1},ty[9]={0,0,0,1,-1,1,-1,0,0};
int a[20][20]={0};
bool horse(int x1,int y1,int i)
{
int x,y;
x=x1+hx[i]; y=y1+hy[i];
if (x<1 || x>10 || y<1 || y>9) return 0;
x=x1+tx[i]; y=y1+ty[i];
if (a[x][y]==1) return 0;
return 1;
}
int main()
{
int n,x,y;
cin >> n >> x >> y;
while(n!=0)
{
int h[20][20]={0},ax[20],ay[20]; bool tt={1}; char ch[20];
for (int i=0;i<20;i++)
for (int j=0;j<20;j++) a[i][j]=0;
for (int i=1;i<=n;i++){
cin >> ch[i] >> ax[i] >> ay[i];
a[ax[i]][ay[i]]=1;
}
for (int i=1;i<=n;i++){
int xx,yy; char c;
c=ch[i]; xx=ax[i]; yy=ay[i];
if (c=='R'){
int t={0};
for (int j=xx+1;j<=3;j++){
if (t==0) h[j][yy]=1;
if (a[j][yy]==1) t++;
}
t=0;
for (int j=xx-1;j>=1;j--){
if (t==0) h[j][yy]=1;
if (a[j][yy]==1) t++;
}
t=0;
for (int j=yy+1;j<=6;j++){
if (t==0) h[xx][j]=1;
if (a[xx][j]==1) t++;
}
t=0;
for (int j=yy-1;j>=4;j--){
if (t==0) h[xx][j]=1;
if (a[xx][j]==1) t++;
}
}
if (c=='G'){
int t={0};
for (int j=xx-1;j>=1;j--){
if (t==0) {
h[j][yy]=1;
if (x==j && y==yy) tt=0;
}
if (a[j][yy]==1) t++;
}
}
if (c=='C'){
int t={0};
for (int j=xx+1;j<=3;j++){
if (t==1) h[j][yy]=1;
if (a[j][yy]==1) t++;
}
t=0;
for (int j=xx-1;j>=1;j--){
if (t==1) h[j][yy]=1;
if (a[j][yy]==1) t++;
}
t=0;
for (int j=yy+1;j<=6;j++){
if (t==1) h[xx][j]=1;
if (a[xx][j]==1) t++;
}
t=0;
for (int j=yy-1;j>=4;j--){
if (t==1) h[xx][j]=1;
if (a[xx][j]==1) t++;
}
}
if (c=='H'){
for (int j=1;j<=8;j++){
if (horse(xx,yy,j)) h[xx+hx[j]][yy+hy[j]]=1;
}
}
}
int xx,yy;
for (int i=0;i<=4;i++){
xx=x+gx[i]; yy=y+gy[i];
if (xx>=1 && xx<=3 && yy>=4 & yy<=6)
if (h[xx][yy]==0) tt=0;
}
if (tt) cout << "YES" << endl; else cout << "NO" << endl;
cin >> n >> x >> y;
}
}