背景:1_WA:忘了把用来检测bug的中间结果输出注释!!
2_WA:各种小错,外加输出处,下标错误!!!!!
3_WA:逻辑错误上的,不自己出数据,并输出中间结果,真是很难发现!
4_WA:俥和帅见面的考虑都错了!!!!!!!如果中间有棋子挡着,俥是不能通过的!!!!帅也是不能见面的!!幸好乱写的测试数据发现了这个!!!
567_WA:结果!已经毫无逻辑错误了!!无奈搜索了解题报告,原来不能用scanf,要用cin!
思路:网上好的思路是把黑方帅下一步要走的位置的所有情况求出来,对每一种情况进行枚举,看是否有红方棋子可以到达该位置。我的思路:是把所有红方可以杀死的位置的出来,看黑将是否可以走到红方无法杀死的位置,但其中的各种讨论着实费心!!
学习:1.#include<iostream> 下的cin来输入,可以略掉空格,TAB,换行符等!
2.自己多出数据!写代码前应该先建立思路!
3.sprintf函数将数字等读入到字符数组中。
char str[30];
int a,b;
sprintf(str,"%d is %d",a,b);
#include<stdio.h>
#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
int map[10][9],count=0;
struct place{
int x;
int y;
}green,ans[1000];
void print(void){
while(1){
if(green.x-1 > 0 && map[green.x-2][green.y-1] != 1 && map[green.x-2][green.y-1] != 9){printf("NO\n"); break;}
if(green.x+1 < 4 && map[green.x][green.y-1] != 1 && map[green.x][green.y-1] != 9){printf("NO\n"); break;}
if(green.y-1 > 3 && map[green.x-1][green.y-2]!= 1 && map[green.x-1][green.y-2] != 9) {printf("NO\n"); break;}
if(green.y+1 < 7 && map[green.x-1][green.y] != 1 && map[green.x-1][green.y] != 9){printf("NO\n"); break;}
printf("YES\n"); break;
}
}
void RR(void){
for(int i=0;i < 10;i++){
for(int j=0;j < 9;j++){
if(map[i][j] == 2){
for(int k=j+1; k < 9;k++){
if(!(map[i][k] == 0 || map[i][k] == 1)){
ans[count].x=i;
ans[count++].y=k;
break;
}
if(map[i][k] == 0 || map [i][k] == 1) map[i][k]=1;
}
for(int k=j-1; k >= 0;k--){
if(!(map[i][k] == 0 || map[i][k] == 1)){
ans[count].x=i;
ans[count++].y=k;
break;
}
if(map[i][k] == 0 || map [i][k] == 1) map[i][k]=1;
}
for(int k=i-1; k >= 0;k--){
if(!(map[k][j] == 0 || map[k][j] == 1)){
ans[count].x=k;
ans[count++].y=j;
break;
}
if(map[k][j] == 0 || map [k][j] == 1) map[k][j]=1;
}
for(int k=i+1; k < 10;k++){
if(!(map[k][j] == 0 || map[k][j] == 1)){
ans[count].x=k;
ans[count++].y=j;
break;
}
if(map[k][j] == 0 || map [k][j] == 1) map[k][j]=1;
}
}
}
}
}
void horse(void){
for(int i=0;i < 10;i++){
for(int j=0;j < 9;j++){
if(map[i][j] == 3){
if(map[i+1][j] == 1 || map[i+1][j] == 0){
if(i+2 < 10 ){
if(j+1 < 9){
if(map[i+2][j+1] == 0) map[i+2][j+1]=1;
else if(map[i+2][j+1] != 1){
ans[count].x=i+2;
ans[count++].y=j+1;
}
}
if(j-1 >= 0){
if(map[i+2][j-1] == 0) map[i+2][j-1]=1;
else if(map[i+2][j-1] != 1){
ans[count].x=i+2;
ans[count++].y=j-1;
}
}
}
}
if(map[i-1][j] == 1 || map[i-1][j] == 0){
if(i-2 >= 0 ){
if(j+1 < 9){
if(map[i-2][j+1] == 0) map[i-2][j+1]=1;
else if(map[i-2][j+1] != 1){
ans[count].x=i-2;
ans[count++].y=j+1;
}
}
if(j-1 >= 0){
if(map[i-2][j-1] == 0) map[i-2][j-1]=1;
else if(map[i-2][j-1] != 1){
ans[count].x=i-2;
ans[count++].y=j-1;
}
}
}
}
if(map[i][j+1] == 1 || map[i][j+1] == 0){
if(j+2 < 9 ){
if(i+1 < 10){
if(map[i+1][j+2] == 0) map[i+1][j+2]=1;
else if(map[i+1][j+2] != 1){
ans[count].x=i+1;
ans[count++].y=j+2;
}
}
if(i-1 >= 0){
if(map[i-1][j+2] == 0) map[i-1][j+2]=1;
else if(map[i-1][j+2] != 1){
ans[count].x=i-1;
ans[count++].y=j+2;
}
}
}
}
if(map[i][j-1] == 1 || map[i][j-1] == 0){
if(j-2 >= 0){
if(i+1 < 10){
if(map[i+1][j-2] == 0) map[i+1][j-2]=1;
else if(map[i+1][j-2] != 1){
ans[count].x=i+1;
ans[count++].y=j-2;
}
}
if(i-1 >= 0){
if(map[i-1][j-2] == 0) map[i-1][j-2]=1;
else if(map[i-1][j-2] != 1){
ans[count].x=i-1;
ans[count++].y=j-2;
}
}
}
}
}
}
}
}
void cannon(void){
for(int i=0;i < 10;i++){
for(int j=0;j < 9;j++){
if(map[i][j] == 4){
bool key=true;
for(int k=i-1;k >= 0;k--){
if(key){if(!(map[k][j] == 0 || map[k][j] ==1)) key=false;}
else{
if(map[k][j] == 0) map[k][j]=1;
else if(map[k][j] != 1){
ans[count].x=k;
ans[count++].y=j;
break;
}
}
}
key=true;
for(int k=i+1;k < 10;k++){
if(key){if(!(map[k][j] == 0 || map[k][j] ==1)) key=false;}
else{
if(map[k][j] == 0) map[k][j]=1;
else if(map[k][j] != 1){
ans[count].x=k;
ans[count++].y=j;
break;
}
}
}
key=true;
for(int k=j+1;k < 9;k++){
if(key){if(!(map[i][k] == 0 || map[i][k] ==1)) key=false;}
else{
if(map[i][k] == 0) map[i][k]=1;
else if(map[i][k] != 1){
ans[count].x=i;
ans[count++].y=k;
break;
}
}
}
key=true;
for(int k=j-1;k >= 0;k--){
if(key){if(!(map[i][k] == 0 || map[i][k] ==1)) key=false;}
else{
if(map[i][k] == 0) map[i][k]=1;
else if(map[i][k] != 1){
ans[count].x=i;
ans[count++].y=k;
break;
}
}
}
}
}
}
}
void GG(void){
for(int i=0;i < 10;i++){
for(int j=0;j < 9;j++){
if(map[i][j] == 5){
for(int k=i-1;k >= 0;k--){
if(!(map[k][j] == 0 || map[k][j] == 1)){
ans[count].x=k;
ans[count++].y=j;
break;
}
if(map[k][j] == 0 || map [k][j] == 1) map[k][j]=1;
}
for(int k=i+1;k < 10;k++){
if(!(map[k][j] == 0 || map[k][j] == 1)){
ans[count].x=k;
ans[count++].y=j;
break;
}
if(map[k][j] == 0 || map [k][j] == 1) map[k][j]=1;
}
return;
}
}
}
}
void step(void){
char c;
int m,n;
cin>>c>>m>>n; //ÔÚ»º³åÇøÓÐÒ»¸ö»»Ðзû¡£
//scanf("%c",&c);
if(c == 'R'){
//scanf("%d%d",&m,&n);
if(map[m-1][n-1] == 1){
ans[count].x=m-1;
ans[count++].y=n-1;
}
map[m-1][n-1]=2;
}
else if( c == 'H'){
//scanf("%d%d",&m,&n);
if(map[m-1][n-1] == 1){
ans[count].x=m-1;
ans[count++].y=n-1;
}
map[m-1][n-1]=3;
}
else if( c == 'C'){
//scanf("%d%d",&m,&n);
if(map[m-1][n-1] == 1){
ans[count].x=m-1;
ans[count++].y=n-1;
}
map[m-1][n-1]=4;
}
else{
//scanf("%d%d",&m,&n);
map[m-1][n-1]=5; //ºì·½Ë§¾ÍÔÚÀÏÎÑÀ¸ù±¾Ã»ÓбØÒª±ê¼ÇΪ9¡£
}
}
int main(void){
int a;
while(cin>>a>>green.x>>green.y && a != 0){
count=0;
memset(map,0,sizeof(map));
while(a--){
step();
}
/**/// for(int i=0;i < 10;i++){for(int j=0;j < 9;j++) printf("%d ",map[i][j]); printf("\n");}printf("\n");
horse();
cannon();
RR();
GG();
for(int i=0;i < count;i++){
map[ans[i].x][ans[i].y]=9;
}
/**/// for(int i=0;i < 10;i++){for(int j=0;j < 9;j++) printf("%d ",map[i][j]); printf("\n");}
if(green.x <5 ) print();
else{
for(int j=0;j < 3;j++)
for(int i=0;i < 3;i++)
map[0+j][3+i]=map[9-j][3+i];
print();
}
}
return 0;
}