UVA-1589 Xiangqi
以前做的题,写的丑,肯定可以优化,但是做过的题不想再看了,直接粘代码。
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
int f[11][10]={},ri[41]={},rj[41]={};
int num,bi,bj;
char c[41]={};
int judge(int i,int j);
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
while(cin>>num>>bi>>bj)
{
if(num==0&&bi==0&&bj==0)
break;
memset(f,0,sizeof(f));
memset(ri,0,sizeof(ri));
memset(rj,0,sizeof(rj));
for(int i=1;i<=num;i++)
{
cin>>c[i]>>ri[i]>>rj[i];
f[ri[i]][rj[i]]=i;
}
int flag=0;
if(bi-1>=1&&!flag)
flag=judge(bi-1,bj);
if(bi+1<=3&&!flag)
flag=judge(bi+1,bj);
if(bj-1>=4&&!flag)
flag=judge(bi,bj-1);
if(bj+1<=6&&!flag)
flag=judge(bi,bj+1);
if(flag==1)
cout<<"NO"<<endl;
else
cout<<"YES"<<endl;
string s;
getline(cin,s);
}
}
int judge(int x,int y)
{
if(f[x][y]!=0)
{
c[f[x][y]]=' ';
f[x][y]=-1;
}
for(int i=1;i<=num;i++)
{
if(c[i]=='G')
{
if(rj[i]==y)
{
int sum=0;
for(int ii=bi+1;ii<=ri[i]-1;ii++)
{
if(f[ii][y]>0)
sum++;
}
if(sum==0)
return 0;
}
}
if(c[i]=='R')
{
if(ri[i]==x)
{
int sum=0;
if(rj[i]<y-1)
{
for(int ii=rj[i]+1;ii<=y-1;ii++)
{
if(f[x][ii]>0)
sum++;
}
}
else if(rj[i]>y+1)
{
for(int ii=y+1;ii<=rj[i]-1;ii++)
{
if(f[x][ii]>0)
sum++;
}
}
if(sum==0)
return 0;
}
else if(rj[i]==y)
{
int sum=0;
if(ri[i]<x-1)
{
for(int ii=ri[i]+1;ii<x-1;ii++)
{
if(f[ii][y]>0)
sum++;
}
}
else if(ri[i]>x+1)
{
for(int ii=x+1;ii<=ri[i]-1;ii++)
{
if(f[ii][y]>0)
sum++;
}
}
if(sum==0)
return 0;
}
}
if(c[i]=='H')
{
if(f[ri[i]-1][rj[i]]==0)
{
if((x==ri[i]-2)&&(y==rj[i]+1||y==rj[i]-1))
return 0;
}
if(f[ri[i]+1][rj[i]]==0)
{
if((x==ri[i]+2)&&(y==rj[i]+1||y==rj[i]-1))
return 0;
}
if(f[ri[i]][rj[i]-1]==0)
{
if((y==rj[i]-2)&&(x==ri[i]+1||x==ri[i]-1))
return 0;
}
if(f[ri[i]][rj[i]+1]==0)
{
if((y==rj[i]+2)&&(x==ri[i]+1||x==ri[i]-1))
return 0;
}
}
if(c[i]=='C')
{
if(ri[i]==x)
{
int sum=0;
if(rj[i]<y-1)
{
for(int ii=rj[i]+1;ii<=y-1;ii++)
{
if(f[x][ii]>0)
sum++;
}
}
else if(rj[i]>y+1)
{
for(int ii=y+1;ii<=rj[i]-1;ii++)
{
if(f[x][ii]>0)
sum++;
}
}
if(sum==1)
return 0;
}
else if(rj[i]==y)
{
int sum=0;
if(ri[i]<x-1)
{
for(int ii=ri[i]+1;ii<x-1;ii++)
{
if(f[ii][y]>0)
sum++;
}
}
else if(ri[i]>x+1)
{
for(int ii=x+1;ii<=ri[i]-1;ii++)
{
if(f[ii][y]>0)
sum++;
}
}
if(sum==1)
return 0;
}
}
}
return 1;
}