搞了一下午。不过AC后成就感也是很大的。感谢黑魂给我带来的耐心。
还有很多代码可以化简一下。
题目地址:
https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4464
样例测试:
https://www.udebug.com/UVa/1589
#include<iostream>
#include <string.h>
#include<cmath>
using namespace std;
int aa[15][15];
int t[4] = {1,0,-1,0};
int u[4] = {0,1,0,-1};
struct qizi
{
int x;
int y;
char c;
}qz[10];
int ju(int n,int bx,int by);
int main()
{
int n = 0;
int bx = 0;
int by = 0;
while(cin>>n>>bx>>by && n!=0 && bx!=0 && by!=0)
{
for(int i = 0;i<15;++i)
{
memset(aa[i],0,sizeof(aa[i]));
}
aa[bx][by] = 1;
for(int i = 0;i<n;++i)
{
cin>>qz[i].c>>qz[i].x>>qz[i].y;
aa[qz[i].x][qz[i].y] = 1;
}
int kp = 0;
for(int i = 0;i<n;++i)
{
kp = 0;
if(qz[i].c == 'G')
{
if(qz[i].y == by)
{
kp = 1;
for(int j = 0;j<n;++j)
{
if((j!=i) && (qz[j].y == qz[i].y) && (qz[j].x>bx) && (qz[i].x>qz[j].x))
{
kp = 0;
break;
}
}
}
}
if(kp)
break;
}
if(kp)
{
cout<<"NO"<<endl;
continue;
}
aa[bx][by] = 0;
int jj = 1;
for(int l = 0;l<4;++l)
{
//吃子
if(bx+t[l]<4 && bx+t[l]>0 && by+u[l]<7 && by+u[l]>3)
{
aa[bx+t[l]][by+u[l]] = 1;
int kl = 0;
int kj = 14;
char cc;
for(int i = 0;i<n;++i)
{
if(bx+t[l] == qz[i].x && by+u[l] == qz[i].y)
{
kl = 1;
cc = qz[i].c;
kj = i;
qz[i].c = 'B';
break;
}
}
if(!ju(n,bx+t[l],by+u[l]))
jj = 0;
if(kl == 0)
aa[bx+t[l]][by+u[l]] = 0;
else
qz[kj].c = cc;
}
}
if(jj == 0)
{
cout<<"NO"<<endl;
}
else
{
cout<<"YES"<<endl;
}
}
}
int ju(int n,int bx,int by)
{
int kx = 14;
int ky = 14;
for(int i = 0;i<n;++i)
{
int k = 0;
if(qz[i].c == 'G')
{
if(qz[i].y == by)
{
k = 1;
for(int j = 0;j<n;++j)
{
if(j!=i && qz[j].c!='B' && qz[j].y == qz[i].y && qz[j].x>bx && qz[i].x>qz[j].x)
{
k = 0;
break;
}
}
}
if(k)
{
//cout<<"G";
return 1;
}
}
if(qz[i].c == 'R')
{
if(qz[i].y == by)
{
k = 1;
for(int j = 0;j<n;++j)
{
if(j!=i && qz[j].c!='B' && qz[j].y == qz[i].y && abs(qz[j].x-bx)<abs(qz[i].x-bx) && (qz[j].x-bx)*(qz[i].x-bx)>0 )
{
k = 0;
break;
}
}
}
if(qz[i].x == bx)
{
k = 1;
for(int j = 0;j<n;++j)
{
if(j!=i && qz[j].c!='B' && qz[j].x == qz[i].x && abs(qz[j].y-by)<abs(qz[i].y-by) && (qz[j].y-by)*(qz[i].y-by)>0)
{
k = 0;
break;
}
}
}
if(k)
{
//cout<<"R";
return 1;
}
}
if(qz[i].c == 'C')
{
if(qz[i].y == by)
{
k = 0;
for(int j = 0;j<n;++j)
{
if(j!=i && qz[j].c!='B' && qz[j].y == qz[i].y && abs(qz[j].x-bx)<abs(qz[i].x-bx) && (qz[j].x-bx)*(qz[i].x-bx)>0)
{
++k;
}
}
}
if(qz[i].x == bx)
{
k = 0;
for(int j = 0;j<n;++j)
{
if(j!=i && qz[j].c!='B' && qz[j].x == qz[i].x && abs(qz[j].y-by)<abs(qz[i].y-by) && (qz[j].y-by)*(qz[i].y-by)>0)
{
++k;
}
}
}
if(k == 1)
{
//cout<<"C";
return 1;
}
}
if(qz[i].c == 'H')
{
for(int j = 0;j<4;++j)
{
if(aa[qz[i].x+t[j]][qz[i].y+u[j]] == 1)
continue;
else
{
switch(j)
{
case 0:
if(qz[i].x+2 == bx && (qz[i].y+1 == by || qz[i].y-1 == by))
{
//cout<<"R";
return 1;
}
break;
case 1:
if(qz[i].y+2 == by && (qz[i].x+1 == bx || qz[i].x-1 == bx))
{
//cout<<"R";
return 1;
}
break;
case 2:
if(qz[i].x-2 == bx && (qz[i].y+1 == by || qz[i].y-1 == by))
{
//cout<<"R";
return 1;
}
break;
case 3:
if(qz[i].y-2 == by && (qz[i].x+1 == bx || qz[i].x-1 == bx))
{
//cout<<"R";
return 1;
}
break;
}
}
}
}
}
return 0;
}