这道题很简单,直接模拟棋盘可以得出,注意一下特殊情况即可;
代码如下,仅视纪念
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int Gplacex,Gplacey;
void printboard(char board[10][9]){
for(int i=0;i<10;i++){
for(int j=0;j<9;j++){
if(board[i][j]==0){
printf("OO");
}else if(board[i][j]==1){
printf("KK");
}else{
printf("%c ",board[i][j]);
}
}
printf("\n");
}
}
int judge(int x,int y,char boardr[10][9]){//杀不掉返回0,杀掉返回1
char board[10][9];
int i,j;
for(i=0;i<10;i++){
for(j=0;j<9;j++){
board[i][j]=boardr[i][j];
}
}
board[x][y]=0;
for(i=0;i<10;i++){
for(j=0;j<9;j++){
if(board[i][j]=='G'&&j==y)
{
int Gflag=1;
if(x>i)
{
for(int z=i+1; z<x; z++)
{
if(board[z][j]=='G'||board[z][j]=='R'||board[z][j]=='H'||board[z][j]=='C')
{
Gflag=0;
break;
}
}
}
else
{
for(int z=x+1; z<i; z++)
{
if(board[z][j]=='G'||board[z][j]=='R'||board[z][j]=='H'||board[z][j]=='C')
{
Gflag=0;
break;
}
}
}
if(Gflag)
{
return 1;//帅将军解决,不采用棋盘赋值法,直接判断法
}
}
if(board[i][j]=='R'){
for(int Rx=i+1;Rx<10&&(board[Rx][j]==0||board[Rx][j]==1);Rx++){
board[Rx][j]=1;
}
for(int Rx=i-1;Rx>=0&&(board[Rx][j]==0||board[Rx][j]==1);Rx--){
board[Rx][j]=1;
}
for(int Ry=j+1;Ry<9&&(board[i][Ry]==0||board[i][Ry]==1);Ry++){
board[i][Ry]=1;
}
for(int Ry=j-1;Ry>=0&&(board[i][Ry]==0||board[i][Ry]==1);Ry--){
board[i][Ry]=1;
}//车解决
}else if(board[i][j]=='C'){
for(int Rx=i+1,flag=0;Rx<10;Rx++){
if(flag==1){
if(board[Rx][j]==0||board[Rx][j]==1){
board[Rx][j]=1;
}else{
break;
}
}
if(board[Rx][j]!=1&&board[Rx][j]!=0){
flag=1;
}
}
for(int Rx=i-1,flag=0;Rx>=0;Rx--){
if(flag==1){
if(board[Rx][j]==0||board[Rx][j]==1){
board[Rx][j]=1;
}else{
break;
}
}
if(board[Rx][j]!=1&&board[Rx][j]!=0){
flag=1;
}
}
for(int Ry=j+1,flag=0;Ry<9;Ry++){
if(flag==1){
if(board[i][Ry]==0||board[i][Ry]==1){
board[i][Ry]=1;
}else{
break;
}
}
if(board[i][Ry]!=1&&board[i][Ry]!=0){
flag=1;
}
}
for(int Ry=j-1,flag=0;Ry>=0;Ry--){
if(flag==1){
if(board[i][Ry]==0||board[i][Ry]==1){
board[i][Ry]=1;
}else{
break;
}
}
if(board[i][Ry]!=1&&board[i][Ry]!=0){
flag=1;
}
}//炮解决
}else if(board[i][j]=='H'){
if(i>=2&&(board[i-1][j]==0||board[i-1][j]==1)){
if(j>=1&&board[i-2][j-1]==0){
board[i-2][j-1]=1;
}
if(j<=7&&board[i-2][j+1]==0){
board[i-2][j+1]=1;
}
}
if(i<=7&&(board[i+1][j]==0||board[i+1][j]==1)){
if(j>=1&&board[i+2][j-1]==0){
board[i+2][j-1]=1;
}
if(j<=7&&board[i+2][j+1]==0){
board[i+2][j+1]=1;
}
}
if(j<=6&&(board[i][j+1]==0||board[i][j+1]==1)){
if(i>=1&&board[i-1][j+2]==0){
board[i-1][j+2]=1;
}
if(i<=8&&board[i+1][j+2]==0){
board[i+1][j+2]=1;
}
}
if(j>=2&&(board[i][j-1]==0||board[i][j-1]==1)){
if(i>=1&&board[i-1][j-2]==0){
board[i-1][j-2]=1;
}
if(i<=8&&board[i+1][j-2]==0){
board[i+1][j-2]=1;
}
}//马解决
}
}
}
//printf("x=%d,y=%d\n",x+1,y+1);
//printboard(board);
return board[x][y];
}
bool isKill(int x,int y,char board[10][9]){
x-=1;
y-=1;
//printboard(board);
if(y==Gplacey){
int flagt=1;
if(x<Gplacex){
for(int z=x+1;z<Gplacex;z++){
if(board[z][y]!=0){
flagt=0;
break;
}
}
}else{
for(int z=Gplacex-1;z>x;z--){
if(board[z][y]!=0){
flagt=0;
break;
}
}
}
if(flagt==1){
return false;
}
}
//考虑一下把对面将死的情况
int flag=1;
if(x-1>=0){
flag*=judge(x-1,y,board);
}
if(x+1<=2){
flag*=judge(x+1,y,board);
}
if(y-1>=3){
flag*=judge(x,y-1,board);
}
if(y+1<=5){
flag*=judge(x,y+1,board);
}
if(flag){
return true;
}else{
return false;
}
}
int main()
{
int amount,EGx,EGy;
while((cin>>amount>>EGx>>EGy)&&amount){
char board[10][9];
memset(board,0,sizeof(board));
for(int i=0;i<amount;i++){
char cheese;
int Cx,Cy;
cin>>cheese>>Cx>>Cy;
board[Cx-1][Cy-1]=cheese;
if(cheese=='G'){
Gplacex=Cx-1;
Gplacey=Cy-1;
}
}
if(isKill(EGx,EGy,board)){
printf("YES\n");
}else{
printf("NO\n");
}
}
return 0;
}
ps:似乎输入有问题,改成C++输入方式才正确