题目(截图)
分析
这个题的难点有两个,一个是输入(不能用gets()),另一个是模拟移动空格的位置,搞定了这两点,AC就很easy啦。
代码+注释
#include<iostream>
#include<stdio.h>
#include<string>
#include<string.h>
using namespace std;
int main()
{
char a,b;
int num=0;
int flag=1;
char arr[10][10]; //储存输入的五行字符串。
while(1) //死循环,若输入Z,则主观终止循环。
{
scanf("%c",&arr[0][0]);
if(arr[0][0]=='Z') //判断是否需要终止循环。
break;
for(int i=1; i<=4; i++) //输入第一行上下的字符串。
{
scanf("%c",&arr[0][i]);
}
getchar(); //吸收换行符(很重要!!!!)。
for(int i=1;i<=4;i++) //输入剩下的四行字符串。
{
for(int j=0;j<5;j++)
{
scanf("%c",&arr[i][j]);
}
getchar();
}
int x1=0,y1=0,x2=0,y2=0;
for(int i=0; i<5; i++) //两重循环寻找空格位置(坐标表示)。
{
for(int j=0; j<5; j++)
{
if(arr[i][j]==' ')
{
x1=i;
y1=j;
break;
}
}
}
flag=1;
while(cin>>a) //输入控制空格移动的字符 。
{
x2=x1; //每输入一次都要重置x2,y2。
y2=y1; //这两行很关键!!!!!非常关键!!!!!!!
if(a=='0')break; //输入完毕则停止循环。
else if(a=='A') //分情况讨论,模拟空格位置的变化。
{
x2=x1-1;
y2=y1;
}
else if(a=='B')
{
x2=x1+1;
y2=y1;
}
else if(a=='R')
{
x2=x1;
y2=y1+1;
}
else if(a=='L')
{
x2=x1;
y2=y1-1;
}
if(x2<0||x2>4||y2<0||y2>4) //若发生非法移动,则flag=0。
{
flag=0;
while(1) //注意!!!一定要输入完剩下的控制空格移动的字符!!!!
{
cin>>a;
if(a=='0')
break;
}
break;
}
else //模拟交换位置。
{
arr[x1][y1]=arr[x2][y2];
arr[x2][y2]=' ';
x1=x2;
y1=y2;
}
}
getchar();
if(num!=0) //判断换行的条件。
{
cout<<endl;
}
num++;
cout<<"Puzzle #"<<num<<":"<<endl; //输出样例的次序。
if(flag==0)
cout<<"This puzzle has no final configuration."<<endl;
else
{
for(int i=0; i<5; i++)
{
for(int j=0; j<5; j++)
{
cout<<arr[i][j];
if(j!=4)
cout<<" ";
}
cout<<endl;
}
}
}
return 0;
}