题目的意思是给你一个5*5的矩阵
在矩阵中有一个位是空格,现在对这个空格的位置进行移动 在空格位置没用超出边界的情况下
在矩阵中有一个位是空格,现在对这个空格的位置进行移动 在空格位置没用超出边界的情况下
输出其改变后的矩阵,如果超出边界输出No!@$#@%^@%^#&(*&^%$^#@%!.....这样0.0
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
char maps[5][7];
char any[1001];
int main()
{
int cases=0;
while(gets(maps[0])){ //读入的行的内容
if (maps[0][0]=='Z') break; //如果第一行的第一个字母为Z则结束
for (int i=1;i<5;++i)
gets(maps[i]); //maps[i]表示二维数组上的行
int a_x = 0,b_y = 0; //遍历空格寻找空坐标
for (int i = 0 ; i < 5 ; ++ i)
for (int j = 0 ; j < 5 ; ++ j)
if (maps[i][j] == ' ') {
a_x = i;b_y = j;
break;
}
int count = 0;
while (~scanf("%c",&any[count])) //~scanf()表示输入语句的二进制反转 不论输入什么都为真 死循环
if (any[count] != '0') count ++; //这里用cmd读入步程
else break; //当读到0的时候结束循环
any[count] = 0;getchar(); //这里让最后一个cmd最后一个'0'变成0 getchar()这里的意思是读取下一个必须的回车键
int flag = 0,x = a_x,y = b_y; //这里用xy记录下空格的位置
for (int i = 0 ; any[i] ; ++ i) { //这里通过步程计算是否有非法指令
switch(any[i]) {
case 'A': x = a_x-1;y = b_y; break;
case 'B': x = a_x+1;y = b_y; break;
case 'L': x = a_x;y = b_y-1; break;
case 'R': x = a_x;y = b_y+1; break;
}
if (x < 0 || x > 4 || y < 0 || y > 4) { //通过一个flag用来在最后判定是否步程非法
flag = 1;break;
}
else {
maps[a_x][b_y] = maps[x][y]; //这里的作用是假设步程没用非法,每走一步就两两交换
maps[x][y] = ' ';
a_x = x; b_y = y; //这里再用b_x,b_y记录下当前空格的位置
}
}
if (cases ++) printf("\n");
printf("Puzzle #%d:\n",cases);
if (flag)
printf("This puzzle has no final configuration.\n");
else {
for (int i = 0 ; i < 5 ; ++ i) { //这里再确认步程没用非法之后输出新的maps
printf("%c",maps[i][0]);
for (int j = 1 ; j < 5 ; ++ j)
printf(" %c",maps[i][j]);
printf("\n");
}
}
}
return 0;
}