題意:
給出黑將,紅馬,紅炮,紅車,紅帥,判斷黑將是否沒地方可走。
思路:
一開始想的用這些馬、炮、車、帥去圖上染色,不怎麼哪裏寫錯了一直wa,後來改爲判斷將能走的幾個位置會不會被別的棋子攻擊。
參考代碼:
#include <stdio.h>
#include <iostream>
#include <vector>
#include <string.h>
using namespace std;
typedef long long ll;
typedef pair<int,int>pii;
int mp[15][15];
int dir[8][2]={1,2,1,-2,-1,2,-1,-2,2,1,2,-1,-2,1,-2,-1};
int dirma[8][2]={1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,-1};
int dir2[4][2]={1,0,0,1,-1,0,0,-1};
bool judgeH(int x,int y){
for(int i=0;i<8;i++){
int dx=x+dir[i][0];
int dy=y+dir[i][1];
if(dx<1||dy<1||dx>10||dy>9)continue;//(dx,dy)是馬的位置
int ddx=x+dirma[i][0];
int ddy=y+dirma[i][1];
if(mp[dx][dy]==1&&mp[ddx][ddy]==0){
return true;
}
}
return false;
}
bool judgeR(int x,int y){
for(int i=x-1;i>0;i--){
if(mp[i][y]){
if(mp[i][y] == 3){
return true;
}
else {
break;
}
}
}
for(int i=x+1;i<11;i++){
if(mp[i][y]){
if(mp[i][y] == 3){
return true;
}
else {
break;
}
}
}
for (int j = y-1; j >= 1; j--){
if (mp[x][j]){
if(mp[x][j] == 3){
return true;
}
else {
break;
}
}
}
for (int j = y+1; j <10; j++){
if (mp[x][j]){
if(mp[x][j] == 3){
return true;
}
else {
break;
}
}
}
return false;
}
bool judgeC(int x,int y){
for (int i = x-1; i >= 1; i--) {
if (mp[i][y]) {
for (int j = i - 1; j >= 1; j--) {
if (mp[j][y]) {
if(mp[j][y] == 2){
return true;
}
else break;
}
}
break;
}
}
for (int i = x+1; i < 11; i++) {
if (mp[i][y]) {
for (int j = i + 1; j < 11; j++) {
if (mp[j][y]) {
if(mp[j][y] == 2){
return true;
}
else break;
}
}
break;
}
}
for (int j = y-1; j >= 1; j--){
if (mp[x][j]){
for (int i = j-1; i >= 1; i--){
if (mp[x][i]){
if(mp[x][i] == 2){
return true;
}
else break;
}
}
break;
}
}
for (int j = y+1; j < 10; j++){
if (mp[x][j]){
for (int i = j+1; i < 10; i++){
if (mp[x][i]){
if(mp[x][i] == 2){
return true;
}
else break;
}
}
break;
}
}
return false;
}
bool judgeG(int x,int y){
for (int i = x+1; i < 11; i++){
if (mp[i][y]){
return mp[i][y] == 4;
}
}
return false;
}
int main(){
int n,sx,sy;
while (~scanf("%d%d%d",&n,&sx,&sy)){
if(!n&&!sx&&!sy){
break;
}
memset(mp,0, sizeof(mp));
char op[2];
int x,y;
for(int i=1;i<=n;i++){
scanf("%s%d%d",op,&x,&y);
if(op[0]=='H'){
mp[x][y]=1;
}
else if(op[0]=='C'){
mp[x][y]=2;
}
else if(op[0]=='R'){
mp[x][y]=3;
}
else {
mp[x][y]=4;
}
}
if(judgeG(sx,sy)){
printf("NO\n");
continue;
}
bool ff= false;
for(int i=0;i<4;i++){
int dx=sx+dir2[i][0];
int dy=sy+dir2[i][1];
if(dx<1||dx>3||dy<4||dy>6)continue;
if(judgeH(dx,dy)||judgeC(dx,dy)||judgeG(dx,dy)||judgeR(dx,dy))continue;
ff=true;
break;
}
printf("%s\n",ff?"NO":"YES");
}
return 0;
}