uva 1589 Xiangqi

sinat_27590807 2015-05-17 12:49:11
不知道为什么总数WA,请帮看看哪里错了,谢谢!

#include<stdio.h>
#include<string.h>

int main()
{
int X[15][15],Q[15][15];
int N,x0,y0;
while(scanf("%d%d%d",&N,&x0,&y0)==3&&N&&x0&&y0)
{
memset(X,0,sizeof X);
memset(Q,0,sizeof Q);
X[x0][y0]=1;
while(N--)
{
while(getchar()!='\n');
char ch;
int x,y,x1,y1;
scanf("%c%d%d",&ch,&x,&y);
switch(ch)
{
case 'G':X[x][y]=1;

while(!X[--x][y]&&x)
Q[x][y]=1;
Q[x][y]=1;
break;
case 'R':X[x][y]=1;

x1=x;
y1=y;
while(!X[--x][y]&&x)
Q[x][y]=1;
Q[x][y]=1;
x=x1;
while(!X[++x][y]&&x<=10)
Q[x][y]=1;
Q[x][y]=1;
x=x1;
while(!X[x][--y]&&y)
Q[x][y]=1;
Q[x][y]=1;
y=y1;
while(!X[x][++y]&&y<=9)
Q[x][y]=1;
Q[x][y]=1;
break;
case 'H':X[x][y]=1;

if(x-1&&!X[x-1][y])
{
if(x-2&&y-1&&!X[x-2][y-1])
Q[x-2][y-1]=1;
if(x-2&&y+1<=9&&!X[x-2][y+1])
Q[x-2][y+1]=1;
}
if(x+1&&!X[x+1][y])
{
if(x+2<=10&&y-1&&!X[x+2][y-1])
Q[x+2][y-1]=1;
if(x+2&&y+1<=9&&!X[x+2][y+1])
Q[x+2][y+1]=1;
}
if(y-1&&!X[x][y-1])
{
if(y-2&&x-1&&!X[y-2][x-1])
Q[y-2][x-1]=1;
if(y-2&&x+1<=9&&!X[y-2][x+1])
Q[y-2][x+1]=1;
}
if(y+1&&!X[x][y+1])
{
if(y+2<=9&&x-1&&!X[y+2][x-1])
Q[y+2][x-1]=1;
if(y+2&&x+1<=9&&!X[y+2][x+1])
Q[y+2][x+1]=1;
}
break;
case 'C':X[x][y]=1;
for(int i=1;x-i;i++)
{
if(!X[x-i][y])
continue;
if(x-i-1&&!X[x-i][y])
{
Q[x-i][y]=1;
break;
}
}
for(int i=1;x+i<=10;i++)
{
if(!X[x+i][y])
continue;
if(x+i+1<=10&&!X[x+i][y])
Q[x+i+1][y]=1;
break;
}
for(int i=1;y-i;i++)
{
if(!X[x][y-i])
continue;
if(y-i-1&&!X[x][y-i-1])
Q[x][y-i-1]=1;
break;
}
for(int i=1;y+i<=9;i++)
{
if(!X[x][y+i])
continue;
if(y+i+1<=9&&!X[x][y+i])
Q[x][y+i+1]=1;
break;
}
break;
}

}
int sum=0;
if(x0-1&&x0-1<=3&&!Q[x0-1][y0])
sum++;
if(x0+1&&x0+1<=3&&!Q[x0+1][y0])
sum++;
if(y0-1>=4&&y0-1<=6&&!Q[x0][y0-1])
sum++;
if(y0+1>=4&&y0+1<=6&&!Q[x0][y0+1])
sum++;
if(!Q[x0][y0])
sum++;
if(!sum)
printf("YES\n");
else printf("NO\n");
}
return 0;
}
...全文
571 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lsh_001 2017-08-09
  • 打赏
  • 举报
回复
这个test本来就没有将死,黑将可以走一步吃掉红方的车啊
fly_dragon_fly 2015-05-19
  • 打赏
  • 举报
回复
引用 4 楼 sinat_27590807 的回复:
[quote=引用 3 楼 fly_dragon_fly 的回复:] 假设红王在中间,无挡,黑王在左边,红车在左边也在九宫内,紧挨黑王
case 'G':X[x][y]=1;
                         x1=x;
                         while(!X[--x][y]&&x)//此处对红王这一列能到达的都设了标记,黑将一往右走就会被吃
                         Q[x][y]=1;
                         Q[x][y]=1;
                         if(y0==y)
                           {
                               int i;
                                for( i=x0+1;i<x1;i++)
                                    if(X[i][y])
                                    break;
                             if(i==x1)
                             sum++;
                           }
                         break;
[/quote] 不是说的红王,是说的红车 ,你试一下这个test 2 1 4 G 10 5 R 2 4
sinat_27590807 2015-05-19
  • 打赏
  • 举报
回复
引用 5 楼 fly_dragon_fly 的回复:
[quote=引用 4 楼 sinat_27590807 的回复:] [quote=引用 3 楼 fly_dragon_fly 的回复:] 假设红王在中间,无挡,黑王在左边,红车在左边也在九宫内,紧挨黑王
case 'G':X[x][y]=1;
                         x1=x;
                         while(!X[--x][y]&&x)//此处对红王这一列能到达的都设了标记,黑将一往右走就会被吃
                         Q[x][y]=1;
                         Q[x][y]=1;
                         if(y0==y)
                           {
                               int i;
                                for( i=x0+1;i<x1;i++)
                                    if(X[i][y])
                                    break;
                             if(i==x1)
                             sum++;
                           }
                         break;
[/quote] 不是说的红王,是说的红车 ,你试一下这个test 2 1 4 G 10 5 R 2 4[/quote]
#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
	int X[15][15],Q[15][15];
	int N,x0,y0;
	while(scanf("%d%d%d",&N,&x0,&y0)==3&&N&&x0&&y0)
	{
		int w=0;
		memset(X,0,sizeof X);
		memset(Q,0,sizeof Q);
		X[x0][y0]=1;
		for(int i=1;i<=3;i++)  
        {  
            for(int j=4;j<=6;j++)  
            {  
                if(fabs(x0-i)<=1&&y0==j)  
                    w++;  
                else if(x0==i&&fabs(y0-j)<=1)  
                    w++; 
            }
        }
		while(N--)
		{
			while(getchar()!='\n');
			char ch;
			int x,y,x1,y1;
			scanf("%c%d%d",&ch,&x,&y);
			switch(ch)
			{
				case 'G':X[x][y]=1;
				         Q[x][y]=1;
				         x1=x;
				         while(!X[--x][y]&&x)
				         Q[x][y]=1;
				         Q[x][y]=1;
				         break;
				case 'R':X[x][y]=1;
				         Q[x][y]=1;
				         x1=x;
						 y1=y;
				         while(!X[--x][y]&&x)
				         Q[x][y]=1;
				         Q[x][y]=1;
				         x=x1;
				         while(!X[++x][y]&&x<=10)
				         Q[x][y]=1;
				         Q[x][y]=1;
				         x=x1;
				         while(!X[x][--y]&&y)
				         Q[x][y]=1;
				         Q[x][y]=1;
				         y=y1;
				         while(!X[x][++y]&&y<=9)
				         Q[x][y]=1;
				         Q[x][y]=1;
				         break;
				case 'H':X[x][y]=1;
				         Q[x][y]=1;
				         if(x-1&&!X[x-1][y])
				            {
				                 if(x-2&&y-1&&!X[x-2][y-1])
				                 Q[x-2][y-1]=1;
				                 if(x-2&&y+1<=9&&!X[x-2][y+1])
				                 Q[x-2][y+1]=1;
				            }
				          if(x+1&&!X[x+1][y])
				            {
				                 if(x+2<=10&&y-1&&!X[x+2][y-1])
				                 Q[x+2][y-1]=1;
				                 if(x+2&&y+1<=9&&!X[x+2][y+1])
				                 Q[x+2][y+1]=1;
				            }
				          if(y-1&&!X[x][y-1])
				            {
				                 if(y-2&&x-1&&!X[y-2][x-1])
				                 Q[y-2][x-1]=1;
				                 if(y-2&&x+1<=9&&!X[y-2][x+1])
				                 Q[y-2][x+1]=1;
				            }
				            if(y+1&&!X[x][y+1])
				            {
				                 if(y+2<=9&&x-1&&!X[y+2][x-1])
				                 Q[y+2][x-1]=1;
				                 if(y+2&&x+1<=9&&!X[y+2][x+1])
				                 Q[y+2][x+1]=1;
				            }
				         break;
				case 'C':X[x][y]=1;
				         Q[x][y]=1;
				         for(int i=1;x-i;i++)
				         {
				         	if(!X[x-i][y])
				         	continue;
				         	if(x-i-1&&!X[x-i][y])
				         	{
				         	 Q[x-i][y]=1;
				         	 break;
				             }
				         } 
				         for(int i=1;x+i<=10;i++)
				         {
				         	if(!X[x+i][y])
				         	continue;
				         	if(x+i+1<=10&&!X[x+i][y])
				         	Q[x+i+1][y]=1;
				         	break;
				         } 
				         for(int i=1;y-i;i++)
				         {
				         	if(!X[x][y-i])
				         	continue;
				         	if(y-i-1&&!X[x][y-i-1])
				         	Q[x][y-i-1]=1;
				         	break;
				         } 
				         for(int i=1;y+i<=9;i++)
				         {
				         	if(!X[x][y+i])
				         	continue;
				         	if(y+i+1<=9&&!X[x][y+i])
				         	Q[x][y+i+1]=1;
				         	break;
				         } 
				         break;
			}
			
		}
	
	    for(int i=1;i<=3;i++)  
        {  
            for(int j=4;j<=6;j++)  
            {  
                if(Q[i][j])  
                {  
                    if(fabs(x0-i)<=1&&y0==j)  
                        w--;  
                    else if(x0==i&&fabs(y0-j)<=1)  
                        w--;  
                }
            }
        }
	    
			 	         
		if(!w)
		printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}
修改后你给的那个测试是YES,但UVA上还是WA,找了别人的代码在UVA能过,但你给的那个测试是NO。。。
fly_dragon_fly 2015-05-18
  • 打赏
  • 举报
回复
假设红王在中间,无挡,黑王在左边,红车在左边也在九宫内,紧挨黑王
sinat_27590807 2015-05-18
  • 打赏
  • 举报
回复
引用 3 楼 fly_dragon_fly 的回复:
假设红王在中间,无挡,黑王在左边,红车在左边也在九宫内,紧挨黑王
case 'G':X[x][y]=1;
                         x1=x;
                         while(!X[--x][y]&&x)//此处对红王这一列能到达的都设了标记,黑将一往右走就会被吃
                         Q[x][y]=1;
                         Q[x][y]=1;
                         if(y0==y)
                           {
                               int i;
                                for( i=x0+1;i<x1;i++)
                                    if(X[i][y])
                                    break;
                             if(i==x1)
                             sum++;
                           }
                         break;
sinat_27590807 2015-05-17
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<string.h>

int main()
{
	int X[15][15],Q[15][15];
	int N,x0,y0;
	while(scanf("%d%d%d",&N,&x0,&y0)==3&&N&&x0&&y0)
	{
		int sum=0;
		memset(X,0,sizeof X);
		memset(Q,0,sizeof Q);
		X[x0][y0]=1;
		while(N--)
		{
			while(getchar()!='\n');
			char ch;
			int x,y,x1,y1;
			scanf("%c%d%d",&ch,&x,&y);
			switch(ch)
			{
				case 'G':X[x][y]=1;
				         x1=x;
				         while(!X[--x][y]&&x)
				         Q[x][y]=1;
				         Q[x][y]=1;
				         if(y0==y)
				           {
				           	int i;
				           	 for( i=x0+1;i<x1;i++)
				           	     if(X[i][y])
				           	     break;
				             if(i==x1)
				             sum++;
				           }
				         break;
				case 'R':X[x][y]=1;
				         
				         x1=x;
						 y1=y;
				         while(!X[--x][y]&&x)
				         Q[x][y]=1;
				         Q[x][y]=1;
				         x=x1;
				         while(!X[++x][y]&&x<=10)
				         Q[x][y]=1;
				         Q[x][y]=1;
				         x=x1;
				         while(!X[x][--y]&&y)
				         Q[x][y]=1;
				         Q[x][y]=1;
				         y=y1;
				         while(!X[x][++y]&&y<=9)
				         Q[x][y]=1;
				         Q[x][y]=1;
				         break;
				case 'H':X[x][y]=1;
				        
				         if(x-1&&!X[x-1][y])
				            {
				                 if(x-2&&y-1&&!X[x-2][y-1])
				                 Q[x-2][y-1]=1;
				                 if(x-2&&y+1<=9&&!X[x-2][y+1])
				                 Q[x-2][y+1]=1;
				            }
				          if(x+1&&!X[x+1][y])
				            {
				                 if(x+2<=10&&y-1&&!X[x+2][y-1])
				                 Q[x+2][y-1]=1;
				                 if(x+2&&y+1<=9&&!X[x+2][y+1])
				                 Q[x+2][y+1]=1;
				            }
				          if(y-1&&!X[x][y-1])
				            {
				                 if(y-2&&x-1&&!X[y-2][x-1])
				                 Q[y-2][x-1]=1;
				                 if(y-2&&x+1<=9&&!X[y-2][x+1])
				                 Q[y-2][x+1]=1;
				            }
				            if(y+1&&!X[x][y+1])
				            {
				                 if(y+2<=9&&x-1&&!X[y+2][x-1])
				                 Q[y+2][x-1]=1;
				                 if(y+2&&x+1<=9&&!X[y+2][x+1])
				                 Q[y+2][x+1]=1;
				            }
				         break;
				case 'C':X[x][y]=1;
				         for(int i=1;x-i;i++)
				         {
				         	if(!X[x-i][y])
				         	continue;
				         	if(x-i-1&&!X[x-i][y])
				         	{
				         	 Q[x-i][y]=1;
				         	 break;
				             }
				         } 
				         for(int i=1;x+i<=10;i++)
				         {
				         	if(!X[x+i][y])
				         	continue;
				         	if(x+i+1<=10&&!X[x+i][y])
				         	Q[x+i+1][y]=1;
				         	break;
				         } 
				         for(int i=1;y-i;i++)
				         {
				         	if(!X[x][y-i])
				         	continue;
				         	if(y-i-1&&!X[x][y-i-1])
				         	Q[x][y-i-1]=1;
				         	break;
				         } 
				         for(int i=1;y+i<=9;i++)
				         {
				         	if(!X[x][y+i])
				         	continue;
				         	if(y+i+1<=9&&!X[x][y+i])
				         	Q[x][y+i+1]=1;
				         	break;
				         } 
				         break;
			}
			
		}
	
	    if(x0-1&&x0-1<=3&&!Q[x0-1][y0])
	    sum++;
	    if(x0+1&&x0+1<=3&&!Q[x0+1][y0])
	    sum++;
	    if(y0-1>=4&&y0-1<=6&&!Q[x0][y0-1])
	    sum++;
	    if(y0+1>=4&&y0+1<=6&&!Q[x0][y0+1])
	    sum++;
	    if(!Q[x0][y0])
	    sum++;
	    
			 	         
		if(!sum)
		printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}
修改后还是WA啊
引用 1 楼 fly_dragon_fly 的回复:
王走一步吃掉将军的棋考虑过没
fly_dragon_fly 2015-05-17
  • 打赏
  • 举报
回复
王走一步吃掉将军的棋考虑过没

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧