题目链接:E - Puzzle
题目大意:
模仿拼图(不是你想的那个拼图 是上下左右推的那个 拼图……)
空格表示可移向的位置
后面是一串移动方案 以数字0结束
A—向上 B—向下 R—向右 L—向左(这里均为空位的移动)
思路:
一行一行输入字符数组中 每次输入查询是否存在空格 把空格下标赋值给x y
之后将移动方案一个字符一个字符输入 遇到0停止
每次输入进行判断和移动
代码如下:
#include
using namespace std;
int main()
{
char str[5][6];
char temp;
int x,y,i,j,r,num=1;
char mn;
while(cin.getline(str[0],6)&&str[0][0]!='Z'){
r=0;
for(i=0;i<5;i++)//查找第一行是否有空格
{
if(str[0][i]==' ')//x为行 y为列
{
r=-1;//减少循环
x=0;
y=i;
break;
}
}
for(i=1;i<5;i++)//录入拼图
{
cin.getline(str[i],6);
for(j=0;j<5&&r==0;j++)//每录一行 查找是否有空格
{
if(str[i][j]==' ')//x为行 y为列
{
r=-1;//减少循环
x=i;
y=j;
break;
}
}
}
r=0;
while(cin>>mn&&mn!='0')//进行拼图
{
switch(mn)
{
case 'A':
temp=str[x][y];
str[x][y]=str[x-1][y];
str[x-1][y]=temp;
x--;
break;
case 'B':
temp=str[x][y];
str[x][y]=str[x+1][y];
str[x+1][y]=temp;
x++;
break;
case 'R':
temp=str[x][y];
str[x][y]=str[x][y+1];
str[x][y+1]=temp;
y++;
break;
case 'L':
temp=str[x][y];
str[x][y]=str[x][y-1];
str[x][y-1]=temp;
y--;
break;
}
if(x==-1||x==5||y==-1||y==5)//移动不合法 输出
{
r=-1;
while(cin>>mn&&mn!='0'){};
break;
}
}
if(num!=1)
cout<