题意:推箱子,可以把箱子推出棋盘外,可以推动连续的箱子,当到达边界时,不能往外走哦。
一步一步走。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;
char m[20][20];
struct point
{
int x,y;
int dir;
} p;
char dir[]= {'v','>','^','<'};
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};
void dfs(int x,int y)
{
if(m[x][y]=='.')
{
m[x][y]=m[x-dx[p.dir]][y-dy[p.dir]];
m[x-dx[p.dir]][y-dy[p.dir]]='.';
}
else
{
dfs(x+dx[p.dir],y+dy[p.dir]);
m[x][y]=m[x-dx[p.dir]][y-dy[p.dir]];
m[x-dx[p.dir]][y-dy[p.dir]]='.';
}
}
bool oor(int x,int y)
{
if(x<1||x>8) return false;
if(y<1||y>8) return false;
return true;
}
void deal()
{
for(int i=0;i<9;i++)
m[0][i]=m[i][0]=m[9][i]=m[i][9]='.';
m[p.x][p.y]='.';
if(!oor(p.x+dx[p.dir],p.y+dy[p.dir])) return ;
dfs(p.x+dx[p.dir],p.y+dy[p.dir]);
p.x=p.x+dx[p.dir];p.y=p.y+dy[p.dir];
}
void out()
{
m[p.x][p.y] = dir[p.dir];
for(int i=1;i<9;i++)
{
for(int j=1;j<9;j++) printf("%c",m[i][j]);
printf("\n");
}
printf("\n");
}
int main()
{
freopen("in.txt","r",stdin);
while(~scanf("%s",m[1]+1)&&m[1][1]!='-')
{
for(int i=2; i<9; i++)
scanf("%s",m[i]+1);
for(int i =1; i<9; i++)
{
for(int j=1; j<9; j++)
if(m[i][j]=='v')
p.x=i,p.y=j,p.dir=0;
else if(m[i][j]=='>')
p.x=i,p.y=j,p.dir=1;
else if(m[i][j]=='^')
p.x=i,p.y=j,p.dir=2;
else if(m[i][j]=='<')
p.x=i,p.y=j,p.dir=3;
}
char op1[10],op2[10];int op3;
while(scanf("%s",op1)&&op1[0]!='#')
{
if(op1[0]=='t')
{
scanf("%s",op2);
if(op2[0]=='l')
p.dir=(p.dir+1)%4;
else if(op2[0]=='r')
p.dir=(p.dir+3)%4;
else
p.dir=(p.dir+2)%4;
}
else
{
scanf("%d",&op3);
for(int i=0;i<op3;i++)
deal();
}
}
out();
}
return 0;
}