UVa 1589 da模拟!!

背景: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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值