首页 > 代码库 > HDU 2414 Chessboard Dance (强行模拟)

HDU 2414 Chessboard Dance (强行模拟)

题目链接: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
#
*/


HDU 2414 Chessboard Dance (强行模拟)