チェスcのUVA-1589版

荒れた海での釣りは、長い時間のためにタッチします。長い余韻の基盤が、長い時間のために変更され、荒れた海での釣りとなっている
純粋なC99とは書いた
要約:
書き込み中側に、ほぼライン上、または変更側に1、おおよそのアイデアを
2に、この質問は、それほど難しいことではありません。それはそうああ行うには勇気持っている、非常に異常に見えますが
3、荒れた海での釣りZhenshuang
すべてのすべては非常に興味深い課題であります

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
//黑将为1,红军为-1,红帅为-2,通过为0 
int red(int [11][10],int,int,int,int,char);
int debug(int [11][10],int,int);
int main(void){
	int map[11][10],ying[11][10];
	int n,x[11],y[10],i,IsPrime=0,e,mrr1,mrr2,Y1,Y2;
	char ch[10];
	while((memset(map,0,sizeof(map)))&&(scanf("%d%d%d",&n,&x[0],&y[0])==3&&n)){
		Y2=0;
		for (i=1;i<=n;i++){             
			while (scanf("%c",&ch[i])){
			    if (isupper(ch[i])){
		        scanf("%d%d",&x[i],&y[i]);
		        map[x[i]][y[i]]=(ch[i]=='G'?-2:-1);//描点  
	            break;
				}
	        }
	    }
	    if(debug(map,x[0],y[0])) {printf("NO\n");continue;}
		for (e=1;e<5;e++){
			Y1=0;//成功时n个棋子均不能吃到 
			for (i=1;i<=n;i++){
				int m0,n0;
	            for (n0=0;n0<11;n0++)
		            for (m0=0;m0<10;m0++)
			            ying[n0][m0]=map[n0][m0];//每次只对ying输入,每次输入要重新覆盖数据 
				mrr1=x[0],mrr2=y[0];//原点及其相对应的移动 
				if (e==1) mrr1+=1;
				if (e==2) mrr1-=1;
				if (e==3) mrr2+=1;
				if (e==4) mrr2-=1;
				if (mrr1<1||mrr1>3||mrr2<4||mrr2>6) {Y1++;break;}//出界 
				if (mrr1==x[i]&&mrr2==y[i]) continue;//被将吃了 (不能用break) 
				if (red(ying,mrr1,mrr2,x[i],y[i],ch[i])) {Y1++;break; }
			}
			if (Y1) Y2++;//有一个红军可以吃,则该方向的判定为正确,要坚定四个方向 
			//printf("Y2=%d\n",Y2); 
		}
		if (Y2==4) printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}
int red(int map[11][10],int x0,int y0,int x,int y,char c){
	int n1,n2;
	//printf("%d %d\n",x0,y0);
	switch (c){
		case 'C':{
	   			for (n1=x-1;n1>=1;n1--) 
				    if (map[n1][y]<0){
   				        for (n2=n1-1;n2>=1;n2--){
					        if (map[n2][y]>=0) map[n2][y]=1;
					        else break;
				        }
				    break;
			        }
				for (n1=x+1;n1<=10;n1++) 
				    if (map[n1][y]<0){
   				        for (n2=n1+1;n2<=10;n2++){
					        if (map[n2][y]>=0) map[n2][y]=1;
					        else break;
				        }
				    break;
			        }
				for (n1=y-1;n1>=1;n1--) 
				    if (map[x][n1]<0){
   				        for (n2=n1-1;n2>=1;n2--){
					        if (map[x][n2]>=0) map[x][n2]=1;
					        else break;
				        }
				    break;
			        }
				for (n1=y+1;n1<=9;n1--) 
				    if (map[x][n1]<0){
   				        for (n2=n1+1;n2<=9;n2++){
					        if (map[x][n2]>=0) map[x][n2]=1;
					        else break;
				        }
				    break;
			        }
			break;
		}
		case 'H':{//存在出界问题。。。不考虑了 
			if (!map[x+1][y]) {
				map[x+2][y-1]=1;
				map[x+2][y+1]=1;
			} 
			if (!map[x-1][y]) {
				map[x-2][y-1]=1;
				map[x-2][y+1]=1;
			} 
			if (!map[x][y+1]) {
				map[x-1][y+2]=1;
				map[x+1][y+2]=1;
			} 
			if (!map[x][y-1]) {
				map[x-1][y-2]=1;
				map[x+1][y-2]=1;
			} 
			break;
		}
		default :{//RG放一起 
			for (n1=x+1;n1<11;n1++) {
			    if (map[n1][y]<0) break;
			    map[n1][y]=1;
			}
			for (n1=x-1;n1>=1;n1--) {
			    if (map[n1][y]<0) break;
			    map[n1][y]=1;
			}
			for (n2=y+1;n2<10;n2++) {
				if (map[x][n2]<0) break;
			    map[x][n2]=1;
		    }
		    for (n2=y-1;n2>=1;n2--) {
				if (map[x][n2]<0) break;
			    map[x][n2]=1;
		    }
        }
	}
	/*int m0,n0;
	for (n0=0;n0<11;n0++){
		for (m0=0;m0<10;m0++)
			printf("%2d",map[n0][m0]);
		putchar('\n');
	}
	printf("%d \n",map[x0][y0]);*/
	if (map[x0][y0]>0) return 1;//-1时返回值似乎也是0  
	else return 0;
}
int debug(int map[11][10],int x0,int y0){
	int x,n,Y=0; 
	for (x=10;x>=7;x--)
		if (map[x][y0]==-2){
			Y=1;
			for (n=x-1;n>x0;n--) 
			if (map[n][y0]<0){
				Y=0;
				break;
			}
		}
	return Y; 
}
リリース元の2件の記事 ウォンの賞賛0 ビュー41

おすすめ

転載: blog.csdn.net/f00000f0/article/details/104312343