谜题(移动方格)

题目:《算法竞赛入门经典》(第2版)刘汝佳    习题3-5     UVa227      P57

问题简述

  一个5×5的网格,一个格子是空的,其他格子各有一个字母,一共有四种指令:A,B,L,R,分别表示把空格上、下、左、右的相邻字母移到空格中。输入初始网格和指令序列,指令序列以数字0结束,输出指令执行完毕后的网格。如果有非法指令,应输出"This puzzle has no final configuration."。

 

 输入:

TRGSJ
XDOKI
M  VLN
WPABE
UQHCF

ARRBBL0

输出:略(按照好看的格式输出)

分析:1、这道题目没有什么思维上的难度,就是输入输出稍微长点。

            2、一步步写代码。

           3、先不要命令台输入代码,给谜题和命令初始化就好了。(谜题的输入)(便于调试)

           4、按照指令移动方格(执行命令)(单独写个函数,用于执行正确的指令)

           5、写一个专门的输出函数。(输出)(也可以用来一步步打印检测步骤4中的指令执行,

                  观察执行是否正确)

          

         6、写语句,在命令台输入谜题和命令。//将步骤3注释掉

         7、在步骤4中添加判断指令正确与否的语句。

         8、over.

        注:我对空格的处理是,打印空格的内容为“  ”;

代码:

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

void move(char puzz[][5],int *x,int *y,char com)
{
	//检查指令是否合法 
	int flag=0;
	if(com!='A'||'B'||'L'||'R') //输入的命令字符出错 
		flag=1;
	if((com=='A'&&*x==0)||(com=='B'&&*x==4)||(com=='L'&&*y==0)||(com=='R'&&*y==4))
		flag=1;//在边界的情况。 
	if(flag==1)
	{
		printf("This puzzle has no final configuration.");
		exit(0);
	}
		
    //执行合法的指令		
	if(com=='A')
	{
		puzz[(*x)][*y]=puzz[*x-1][*y];
		(*x)--;
	}
	if(com=='B')
	{
		puzz[(*x)][*y]=puzz[*x+1][*y];
		(*x)++; 
	}//puzz[(*x)++][*y]=puzz[*x+1][*y];不要这么写 
	if(com=='L')
	{
		puzz[*x][(*y)]=puzz[*x][*y-1];
		(*y)--; 
	}
	if(com=='R')
	{
		puzz[*x][(*y)]=puzz[*x][*y+1];
		(*y)++;
	}
}

void print_puzz(char puzz[][5],int x,int y)
{
	int i,j;
	for(i=0;i<5;i++)
	{
		for(j=0;j<5;j++) 
		{	
			if(i==x&&j==y)
				printf("  ");
			else
				printf("%c ",puzz[i][j]);
		}	
		printf("\n");
	}
	printf("\n");
}


int main()
{
	int len,i,j,x,y;//xy用来存储空格的位置 
	char puzz[5][5],com[30]; 
	/*char puzz[5][5]={"TRGSJ",
	                 "XDOKI",
				     "M VLN",
				     "WPABE",
				     "UQHCF"};
	char com[30]="ARRBBL0";*/
	
	
	for(i=0;i<5;i++)//输入谜题 
	{
		for(j=0;j<5;j++)
		{
			puzz[i][j]=getchar();
		}
		getchar();//接收回车 
	}
	
	i=0;
	while((com[i++]=getchar())!='0');//输入命令,0也输入进去 
	
	len=strlen(com);
	x=2;y=1;
	print_puzz(puzz,x,y); 
	
	for(i=0;i<len-1;i++)//执行指令 
	{
		move(puzz,&x,&y,com[i]);
		//print_puzz(puzz,x,y);
	}
	
	print_puzz(puzz,x,y); //输出结果 
	
	return 0;
} 

 结果:

猜你喜欢

转载自blog.csdn.net/sinat_38816924/article/details/82793761