UVA1589象棋 解题过程

UVA1589象棋 解题过程

我确定了一种思路,就是全局考虑,把因为红棋存在而黑棋不能存在的地方在全部标识为1,黑棋可以存在的地方为0,输入黑棋位置后,确认是否有距离为0或1且可以存在的点,这样就很好想了

讲几个需要注意的点

  • 要考虑黑棋吃子的情况
  • 考虑炮可吃的范围

这是我在uva上的第一个代码,一开始不是很情愿的来到这个专业,觉得自己还是可以学好的,有时候兴趣还是不要发展为职业比较好,职业也可以被我很热爱的呀。

一段漂亮的代码片

#include<iostream>
#include<cstring>
#include<stdio.h>
using namespace std;
int map[15][15],judgemap[15][15],map1[15][15],jm1[15][15];
int rednum,Y,X;
void check()
{
	int i,j,m,n,zt;
	for(i=1;i<=10;i++){
		for(j=1;j<=9;j++){
			if(map[i][j]=='R')
			  {
			  	for(m=i-1;m>=1;m--)
				  if(map[m][j]&&map[m][j]!='R') break;
				  else judgemap[m][j]=1; 
				for(m=i+1;m<=10;m++)
				  if(map[m][j]&&map[m][j]!='R') break;
				  else judgemap[m][j]=1;  
				for(n=j+1;n<=9;n++)
				  if(map[i][n]&&map[i][n]!='R') break;
				  else judgemap[i][n]=1;
				for(n=j-1;n>=1;n--)
				  if(map[i][n]&&map[i][n]!='R') break;
				  else judgemap[i][n]=1; 
			  } 
			if(map[i][j]=='C')
			  {
			  	for(m=i-1;m>=1;m--){
			  		if(map[m][j])
			  		  {
			  		  	for(m=m-1;m>=1&&map[m][j]==0;m--) judgemap[m][j]=1;
			  		  	break;
					  }
				}
				for(m=i+1;m<=10;m++){
			  		if(map[m][j])
			  		  {
			  		  	for(m=m+1;m<=10&&map[m][j]==0;m++) judgemap[m][j]=1;
			  		  	break;
					  }
				}
				for(n=j+1;n<=9;n++){
			  		if(map[i][n])
			  		  {
			  		  	for(n=n+1;n<=9&&map[i][n]==0;n++) judgemap[i][n]=1;
			  		  	break;
					  }
				}
				for(n=j-1;n>=1;n--){
			  		if(map[i][n])
			  		  {
			  		  	for(n=n-1;n>=1&&map[i][n]==0;n--) judgemap[i][n]=1;
			  		  	break;
					  }
				}
		      }
		    if(map[i][j]=='H')
		      {
		    	if(!map[i+1][j]) 
				  {
				    if(i<=8&&j>=2)judgemap[i+2][j-1]=1;if(i<=8&&j<=8)judgemap[i+2][j+1]=1;
				  } 
				if(i>=2&&!map[i-1][j]) 
				  {
				  	if(i>=3&&j>=2)judgemap[i-2][j-1]=1;if(i>=3&j<=8)judgemap[i-2][j+1]=1;
				  }
				if(!map[i][j+1])
				  {
				    if(j<=7&&i<=9)judgemap[i+1][j+2]=1;if(j<=7&&i>=2)judgemap[i-1][j+2]=1;
				  } 
				if(j>=2&&!map[i][j-1]) 
				  {
				    if(j>=3&&i<=9)judgemap[i+1][j-2]=1;if(j>=3&&i>=2)judgemap[i-1][j-2]=1;	
				  }
			  }
			if(map[i][j]=='G')
			  {
			     for(m=i-1;m>=1&&map[m][j]==0;m--)
			     judgemap[m][j]=1;
			  }
		}
		
	}
}

void getinfo()//录入信息
{
	
	int y,x;
	while(rednum>=1)
		{
			char army;
			cin>>army>>y>>x;
			map[y][x]=army;
			judgemap[y][x]=1;
			rednum--; 
		}		
}
void print()//用于debug 
{
	int i,j;
	for(i=1;i<=10;i++)
	for(j=1;j<=9;j++)
	{
		if(9-j)printf("%d ",judgemap[i][j]);
		else printf("%d \n",judgemap[i][j]);
	}
 } 
void print1()//用于debug 
{
	int i,j;
	for(i=1;i<=10;i++)
	for(j=1;j<=9;j++)
	{
		if(9-j)printf("%c ",!map[i][j]?'0':map[i][j]);
		else printf("%c \n",!map[i][j]?'0':map[i][j]);
	}
 } 
int main()
{
   int x,y,status;
   int p,q; 
   
  
   while(cin>>rednum>>Y>>X&&Y&&X&&rednum)
   	{   
   		memset(map,0,sizeof(map));
	    memset(judgemap,0,sizeof(judgemap)); 
   	    status=0;
   		getinfo();
   		memcpy(map1,map,sizeof(map));memcpy(jm1,judgemap,sizeof(judgemap));
    	for(y=1;y<=3;y++)
		{
		for(x=4;x<=6;x++)
		  {
		  	
		     if(((y-Y)*(y-Y)+(X-x)*(X-x)<=1))
			    {
			      map[y][x]=0;judgemap[y][x]=0; 
				  check();
				  for(p=1;p<=3;p++)
					{
					for(q=4;q<=6;q++)
		 			 {
		     			if(judgemap[p][q]==0&&p==y&&q==x)
			    	      {
			       			status=1;	break;
					      }	
		  			 }
		  			 if(status) break;
					}
					memcpy(map,map1,sizeof(map));memcpy(judgemap,jm1,sizeof(jm1));
					if(status) break;	
				}
		  }	if(status) break;
		}
    	printf("%s\n",!status?"YES":"NO");
	/*	print();
		cout<<endl;
		print1();
		 printf("%d %d\n",p,q); */
	}
   return 0;	
} 

谢谢大家!
第一次用markdown也不是很熟练

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值