谜题(Puzzle, ACM/ICPC World Finals 1993, UVa227)

有一个5*5的网格,其中恰好有一个格子是空的,其他格子各有一个字母。一共有4种指 令:A, B, L, R,分
别表示把空格上、下、左、右的相邻字母移到空格中。输入初始网格和指 令序列(以数字0结束),输出指令执行完毕后的网格。如果有非法指令,应输出“This puzzle has no final configuration.”,例如,图3-5中执行ARRBBL0后,效果如图3-6所示。在这里插入图片描述
下列使用Dec++编译的代码:

#include <iostream> 

char a[5][5]={	'T','R','G','S','J',
            	'X','D','O','K','I',
                'M',' ','V','L','N',
                'W','P','A','B','E',
                'U','Q','H','C','F'	};
int main()
{
	char c = 0;
	int error1 = 0,error2 =0;
	int i = 2,j = 1;//原空格位置 i行j列 
  	while(scanf("%c",&c) && c != '0' )
  	{
  		char t = 0;
  		if( 5 == j+1 || 5 == i+1)//判断数组溢出 
  		{
  			error2 = 1;
  			break;
		}
  		switch(c)
  		{
  			case 'A':	t=a[i-1][j];
			  		 	a[i-1][j] = a[i][j];
			  		 	a[i][j] =t;
			  		 	i--;
			  		 	//printf("%d,%d\n",i,j);
			  		 	break;
 			case 'B':	t=a[i+1][j];
			  		 	a[i+1][j] = a[i][j];
			  		 	a[i][j] =t;
			  		 	i++;
			  		 	//printf("%d,%d\n",i,j);
			  		 	break;
			case 'L':	t=a[i][j-1];
			  		 	a[i][j-1] = a[i][j];
			  		 	a[i][j] =t;
			  		 	j--;
			  		 	//printf("%d,%d\n",i,j);
			  		 	break;
			case 'R':	t=a[i][j+1];
			  		 	a[i][j+1] = a[i][j];
			  		 	a[i][j] =t;
			  		 	j++;
			  		 	//printf("%d,%d\n",i,j);
			  		 	break;
			case '0':	break;
  			default: error1 = 1;
  					break;	  
		}
	}
		if(error1 || error2)
			printf("This puzzle has no final configuration.");
		else
			for(int i=0;i<5;i++)
			{
				for(int j=0;j<5;j++)
				{
					printf("%c	",a[i][j]);
					if(4 == j)
						printf("\n");				
				}	
			}
	return 0;
}

	
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值