http://acm.hust.edu.cn/vjudge/contest/123676#problem/G 密码5201
ps
1.前面是讲规则。
2.第一行输入红棋个数 和黑将位置
3.H 表示马 C 表示炮 R 表示车 G 表示帅
4.
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
char chess[11][10]; //行 列
int kx[4]={1,-1,-1,1};
int ky[4]={0,1,-1,-1};
int x,y;
int flag=0;
int G(int a,int b)//将
{
if(a==x&&y==b) return 0;
if(b==y)
{
int i;
int mi=min(a,x);
int mx=max(a,x);
for(i=mi+1;i<mx;i++)
{
if(chess[i][y]!=0) return 0;
}
flag++;
return 1;
}
return 0;
}
int R(int a,int b) //车
{
if(a==x&&y==b) return 0;
if(G(a,b)) return 1;
if(a==x)
{
int mi=min(y,b);
int mx=max(y,b);
int i;
for(i=mi+1;i<mx;i++)
{
if(chess[x][i]!=0) return 0;
}
flag++;
return 1;
}
return 0;
}
int H(int a,int b) //马
{
if(a==x&&y==b) return 0;
if( abs(a-x)+abs(b-y)!=3 ) return 0;
if(abs(a-x)==2)
{
int tx=(a+x)/2;
if(chess[tx][b]!=0) return 0;
flag++;
return 1;
}
else if(abs(b-y)==2)
{
int ty=(b+y)/2;
if(chess[a][ty]!=0) return 0;
flag++;
return 1;
}
return 0;
}
int C(int a,int b) //炮
{
if(a==x&&y==b) return 0;
if(a==x)
{
int cut=0,i;
int mi=min(b,y),mx=max(b,y);
for(i=mi+1;i<mx;i++)
{
if(chess[x][i]!=0) cut++;
if(cut==2) return 0;
}
if(cut==1) {flag++;return 1;}
}
else if(b==y)
{
int cut=0,i;
int mi=min(a,x),mx=max(a,x);
for(i=mi+1;i<mx;i++)
{
if(chess[i][y]!=0) cut++;
if(cut==2) return 0;
}
if(cut==1) {flag++;return 1;}
return 0;
}
return 0;
}
int main()
{
int n;
//freopen("C:\\Users\\5201\\Desktop\\1.txt","r",stdin);
//freopen("C:\\Users\\5201\\Desktop\\yb.txt","w",stdout);
while(/*scanf("%d%d%d",&n,&x,&y)*/cin>>n>>x>>y)
{
if(n==0&&x==0&&y==0) break;
// getchar();
memset(chess,0,sizeof(chess));
int a,b,tx,ty;char c;
flag=0;
while(n--)
{
// scanf("%c%d%d",&c,&a,&b);getchar();
cin>>c>>a>>b;
chess[a][b]=c;
if(c=='G'){tx=a;ty=b;}
}
if(G(tx,ty)){printf("NO\n");continue;}
int i,j,k;
for(k=0;k<4;k++)
{
x+=kx[k];y+=ky[k];
if(x<1||x>3) {flag++;continue;}
if(y<4||y>6) {flag++;continue;}
for(i=1;i<=10;i++)
{
for(j=1;j<=9;j++)
{
char ch=chess[i][j];
if(ch==0) continue;
if(ch=='G')
{
if( G(i,j) ) break;
}
else if(ch=='C')
{
if( C(i,j) ) break;
}
else if(ch=='R')
{
if( R(i,j) ) break;
}
else if(ch=='H')
{
if( H(i,j) ) break;
}
}
if(j<=9) break;
}
}
printf(flag==4?"YES\n":"NO\n");
}
return 0;
}
ps
1.输入要注意,用注释掉的代码提交就错了,用cin就过了…… 原因不明。
2.在棋盘中读入红棋,遍历棋盘,找到相应棋子,判断能不能吃掉黑棋。