Uva227

#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>

using namespace std;

int main(void)
{
	char c=0;//记录是否读取到了Z,表示结束
	scanf("%c",&c);
	char frame[5][5];
	int ei=-1,ej=-1;//记录空格的下标
	int count=1;//记录当前处理的是第几组数据
	while('Z'!=c)
	{
		//读入输入的网格数据
		memset(frame,0,sizeof(frame));//将数组清零
		frame[0][0]=c;
		for(int i=0;i<5;i++)
		{
			for(int j=0;j<5;j++)
			{
				if(0==i&&0==j);//因为第一个位置已经被赋值,所以跳过
				else
					scanf("%c",&frame[i][j]);
				if(frame[i][j]==' ')//判断是否是空格
					ei=i,ej=j;
			}
			scanf("%*c");//清除每行后面的'\n'
		}
		//读入指令序列,以0结尾
		string buf,cmd="";
		cin>>buf;
		cmd=buf;
		while('0'!=buf[buf.size()-1])
		{
			buf.clear();
			cin>>buf;
			cmd=cmd+buf;
		}
		//用指令控制网格
		int length=cmd.size();
		int flag=1;//表示指令的正确性,1表示正确
		for(int i=0;i<length-1;i++)
		{
			switch(cmd[i])
			{
				case 'A':
					if(0==ei)
						flag=0;
					else
					{
						frame[ei][ej]=frame[ei-1][ej];
						ei-=1;
						frame[ei][ej]=' ';
					}
					break;
				case 'B':
					if(4==ei)
						flag=0;
					else
					{
						frame[ei][ej]=frame[ei+1][ej];
						ei+=1;
						frame[ei][ej]=' ';
					}
					break;
				case 'R':
					if(4==ej)
						flag=0;
					else
					{
						frame[ei][ej]=frame[ei][ej+1];
						ej+=1;
						frame[ei][ej]=' ';
					}
					break;
				case 'L':
					if(0==ej)
						flag=0;
					else
					{
						frame[ei][ej]=frame[ei][ej-1];
						ej-=1;
						frame[ei][ej]=' ';
					}
					break;
				default:
				break;
			}
		}
		
		scanf("%*c%c",&c);//cin遇到空格停止输入,所以这里要清除cin>>cmd时的换行符
		//输出整理后的网格数据
		cout<<"Puzzle #"<<count<<":"<<endl;
		count++;
		if(1==flag)
		{
			for(int i=0;i<5;i++)
			{
				for(int j=0;j<4;j++)
					cout<<frame[i][j]<<" ";
				cout<<frame[i][4]<<endl;
			}
			if('Z'!=c)
				cout<<endl;
		}
		else
		{
			cout<<"This puzzle has no final configuration."<<endl;
			if('Z'!=c)
				cout<<endl;
		}
			
	}
	return 0;
}

点赞