您的位置:首页 > 其它

HDU 2414 Chessboard Dance (力模拟)

2015-10-13 13:30 459 查看
主题链接:HDU 2414 Chessboard Dance

意甲冠军:鉴于地图,>,<,^,v的方向,字母相当于是箱子,箱子能够推出边界。人保证不会做出边界。以下输入指令,依照指令走,输出结束时图的状态。

强行模拟一遍,注意以下给出的案例。

>t.p.p.p
...a....
........
...bfg.y
...c...
...d....
...e....
........
move 3
turn right
move 3
turn left
move 3
turn left
move 3
#


AC代码:

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn=20;
char mp[maxn][maxn];
queue<char> q;
int get_dir(int x,int y)
{
if(mp[x][y]=='^')
return 1;
else if(mp[x][y]=='>')
return 2;
else if(mp[x][y]=='v')
return 3;
else if(mp[x][y]=='<')
return 4;
}

void out()
{
int i,j;
//printf("---------------------\n");
for(i=0; i<8; i++)
{
for(j=0; j<8; j++)
printf("%c",mp[i][j]);
printf("\n");
}
printf("\n");
}

int main()
{
int i,j;
int dir,x,y;
char scr[20];
while(scanf("%s",mp[0])!=EOF)
{
if(strcmp(mp[0],"--")==0)
break;
while(!q.empty())
q.pop();
for(i=1; i<8; i++)
scanf("%s",mp[i]);
for(i=0; i<8; i++)
{
for(j=0; j<8; j++)
{
if(mp[i][j]=='>' || mp[i][j]=='^' || mp[i][j]=='<' || mp[i][j]=='v')
{
x=i;
y=j;
dir=get_dir(x,y);
break;
}
}
}
//out();
while(1)
{
scanf("%s",scr);
if(strcmp(scr,"#")==0)
break;
while(!q.empty())
q.pop();
if(strcmp(scr,"move")==0)
{
int ss;
scanf("%d",&ss);
if(dir==1)//向上
{
int temp;
if(ss>=x)//!走出边界
{
temp=x;
for(i=x;i>=0;i--)
mp[i][y]='.';
mp[x=0][y]='^';
}
else
{
mp[x][y]='.';
int temp=x-1;
int cont=ss;
while(cont--)
{
while(mp[temp][y]!='.' && temp>=0)
{
q.push(mp[temp][y]);
mp[temp][y]='.';
temp--;
}
temp--;
}
temp=x-ss;
mp[x=temp--][y]='^';
for(;temp>=0 && !q.empty();temp--)
{
mp[temp][y]=q.front();
q.pop();
}
}
//out();
}
else if(dir==2)//向右
{
int temp;
if(ss>=7-y)//!走出边界
{
temp=7-y;
for(i=y;i<8;i++)
mp[x][i]='.';
mp[x][y=7]='>';
}
else
{
mp[x][y]='.';
int temp=y+1;
int cont=ss;
while(cont--)
{
while(mp[x][temp]!='.' && temp<8)
{
q.push(mp[x][temp]);
mp[x][temp]='.';
temp++;
}
temp++;
}
temp=y+ss;
mp[x][y=temp++]='>';
for(;temp<8 && !q.empty();temp++)
{
mp[x][temp]=q.front();
q.pop();
}
}
//out();
}
else if(dir==3)//向下
{
int temp;
if(ss>=7-x)//!走出边界
{
temp=7-x;
for(i=x;i<8;i++)
mp[i][y]='.';
mp[x=7][y]='v';
}
else
{
mp[x][y]='.';
int temp=x+1;
int cont=ss;
while(cont--)
{
while(mp[temp][y]!='.' && temp<8)
{
q.push(mp[temp][y]);
mp[temp][y]='.';
temp++;
}
temp++;
}
temp=x+ss;
mp[x=temp++][y]='v';
for(;temp<8 && !q.empty();temp++)
{
mp[temp][y]=q.front();
q.pop();
}
}
//out();
}
else if(dir==4)//向左
{
int temp;
if(ss>=y)//!走出边界
{
temp=y;
for(i=y;i>=0;i--)
mp[x][i]='.';
mp[x][y=0]='<';
}
else
{
mp[x][y]='.';
int temp=y-1;
int cont=ss;
while(cont--)
{
while(mp[x][temp]!='.' && temp>=0)
{
q.push(mp[x][temp]);
mp[x][temp]='.';
temp--;
}
temp--;
}
temp=y-ss;
mp[x][y=temp--]='<';
for(;temp>=0 && !q.empty();temp--)
{
mp[x][temp]=q.front();
q.pop();
}
}
//out();
}
}
else if(strcmp(scr,"turn")==0)
{
char cc[20];
scanf("%s",cc);
if(strcmp(cc,"left")==0)
{
if(dir==1) dir=4,mp[x][y]='<';
else if(dir==2) dir=1,mp[x][y]='^';
else if(dir==3) dir=2,mp[x][y]='>';
else if(dir==4) dir=3,mp[x][y]='v';
}
else if(strcmp(cc,"right")==0)
{
if(dir==1) dir=2,mp[x][y]='>';
else if(dir==2) dir=3,mp[x][y]='v';
else if(dir==3) dir=4,mp[x][y]='<';
else if(dir==4) dir=1,mp[x][y]='^';
}
else if(strcmp(cc,"back")==0)
{
if(dir==1) dir=3,mp[x][y]='v';
else if(dir==2) dir=4,mp[x][y]='<';
else if(dir==3) dir=1,mp[x][y]='^';
else if(dir==4) dir=2,mp[x][y]='>';
}
//out();
}
}
out();
}
return 0;
}
/*
.....c..
.p..A..t
D..>T.Pr
....aP.P
p.d.C...
.....p.R
........
........
move 5

.....c..
.p..A..t
D..>T.Pr
....aP.P
p.d.C...
.....p.R
........
........
move 1
turn left
move 99
turn back
move 6
#
.....c..
.p.....t
D....TPr
.....P.P
p.d.C...
.....p.R
....v...
....a...

>t.p.p.p ...a.... ........ ...bfg.y ...c... ...d.... ...e.... ........ move 3 turn right move 3 turn left move 3 turn left move 3 #

.>ta.cb.
........
........
........
........
........
........
........
move 3
#
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: