• 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("---------------------
    ");
    	for(i=0; i<8; i++)
    	{
    		for(j=0; j<8; j++)
    			printf("%c",mp[i][j]);
    		printf("
    ");
    	}
    	printf("
    ");
    }
    
    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
    #
    */


    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    14款经典的MySQL客户端软件
    淘宝、百度软件工程师们小调皮,各种霸气外漏
    使用Navicat for Oracle工具连接oracle出错:ORA-12737
    解析xlsx与xls--使用2012poi.jar
    LUOGU P4163 [SCOI2007]排列
    LUOGU P1337 [JSOI2004]平衡点 / 吊打XXX(模拟退火)
    LUOGU P1438 无聊的数列 (差分+线段树)
    LUOGU P1967 货车运输(最大生成树+树剖+线段树)
    LUOGU P3382 【模板】三分法 (三分)
    LUOGU P4027 [NOI2007]货币兑换 (斜率优化+CDQ分治)
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4874346.html
Copyright © 2020-2023  润新知