这是一道字符串模拟题,可以用来锻炼代码能力吧。
题意很简单给定一个5*5的迷宫,其中有一个空格,每次操作都是让空格进行移动,输出一系列操作之后的迷宫。
代码:
#include <iostream>
#include <cstdio>
#include <string.h>
#include <map>
#include <stack>
#include <queue>
#include <algorithm>
#include <math.h>
#include <vector>
#include <set>
#define from(i,a,n) for(int i=a;i<n;i++)
#define refrom(i,n,a) for(int i=n;i>=a;i--)
#define EPS 1e-10
#define mod 1000000007
using namespace std;
const double INF=0x3f3f3f3f;
const int MAX =8;
char puzzle[MAX][MAX];
int main()
{
int t=0;
while(gets(puzzle[0]))
{
int x,y;
if(puzzle[0][0]=='Z') break;
from(i,1,5)
gets(puzzle[i]);
from(i,0,5)
from(j,0,5)
if(puzzle[i][j]==' ')
{
x=i;
y=j;
}//找到空格的位置
char c;
bool flag=false;//标记变量,用于判断是否越界
while((c=getchar())!='0')
{
if(flag) continue;//如果已经越界,则不用继续操作
if(c=='R')
{
if(y+1>=5) flag=true;//越界进行标记,否则交换两个字符的位置
else swap(puzzle[x][y],puzzle[x][y+1]);
y++;//空格坐标相应的改变
}
if(c=='L')
{
if(y-1<0) flag=true;
else swap(puzzle[x][y],puzzle[x][y-1]);
y--;
}
if(c=='B')
{
if(x+1>=5) flag=true;
else swap(puzzle[x][y],puzzle[x+1][y]);
x++;
}
if(c=='A')
{
if(x-1<0) flag=true;
else swap(puzzle[x][y],puzzle[x-1][y]);
x--;
}
/*cout<<c<<endl;
from(i,0,5)
from(j,0,5)
{
if(j!=4) printf("%c ",puzzle[i][j]);
else printf("%c\n",puzzle[i][j]);
}
cout<<endl;*/
}
getchar();//这个很重要,拿掉操作后面的回车,否则影响下一个数据的结果
if(t) printf("\n");//除第一个数据,后面每个数据与前一个数据之间有几个空格
printf("Puzzle #%d:\n",++t);
if(flag) printf("This puzzle has no final configuration.\n");
else
{
from(i,0,5)
from(j,0,5)
{
if(j!=4) printf("%c ",puzzle[i][j]);
else printf("%c\n",puzzle[i][j]);
}
}
}
return 0;
}