POJ 3344 & HDU 2414 Chessboard Dance(模拟)

题目链接:

PKU:http://poj.org/problem?

id=3344

HDU:http://acm.hdu.edu.cn/showproblem.php?pid=2414

Description

Another boring Friday afternoon, Betty the Beetle thinks how to amuse herself. She goes out of her hiding place to take a walk around the living room in Bennett‘s house. Mr. and Mrs. Bennett are out to the theatre and there is a chessboard on the table!
"The best time to practice my chessboard dance," Betty thinks! She gets so excited that she does not note that there are some pieces left on the board and starts the practice session! She has a script showing her how to move on the chessboard. The script is
a sequence like the following example:

At each instant of time Betty, stands on a square of the chessboard, facing one of the four directions (up, down, left, right) when the board is viewed from the above. Performing a "move n" instruction, she moves n squares forward in her
current direction. If moving n squares goes outside the board, she stays at the last square on the board and does not go out. There are three types of turns: turn right, turn left, and turn back, which change the direction of Betty. Note that turning
does not change the position of Betty.

If Betty faces a chess piece when moving, she pushes that piece, together with all other pieces behind (a tough beetle she is!). This may cause some pieces fall of the edge of the chessboard, but she doesn‘t care! For example, in the following figure, the
left board shows the initial state and the right board shows the state after performing the script in the above example. Upper-case and lower-case letters indicate the white and black pieces respectively. The arrow shows the position of Betty along with her
direction. Note that during the first move, the black king (r) falls off the right edge of the board!

You are to write a program that reads the initial state of the board as well as the practice dance script, and writes the final state of the board after the practice.

Input

There are multiple test cases in the input. Each test case has two parts: the initial state of the board and the script. The board comes in eight lines of eight characters. The letters r, d, t, a, c, p indicate black pieces, R, D, T, A, C, P indicate the
white pieces and the period (dot) character indicates an empty square. The square from which Betty starts dancing is specified by one of the four characters <, >, ^, and v which also indicates her initial direction (left, right, up, and down respectively).
Note that the input is not necessarily a valid chess game status.

The script comes immediately after the board. It consists of several lines (between 0 and 1000). In each line, there is one instruction in one of the following formats (n is a non-negative integer number):

move n

turn left

turn right

turn back

At the end of each test case, there is a line containing a single # character. The last line of the input contains two dash characters.

Output

The output for each test case should show the state of the board in the same format as the input. Write an empty line in the output after each board.

Sample Input

.....c..
.p..A..t
D..>T.Pr
....aP.P
p.d.C...
.....p.R
........
........
move 2
turn right
move 3
turn left
turn left
move 1
#
--

Sample Output

.....c..
.p..A..t
D.....TP
....a..P
p.d.C^..
.......R
.....P..
.....p..

Source

Tehran 2006

题意:

模拟推箱子的过程,依照所给的步骤推完后输出终于的棋盘状态!

PS:

注意在推的过程中,不能走出棋盘外,所推的棋子能够出棋盘。

代码例如以下:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn = 27;
char mm[maxn][maxn];
struct node
{
    int x;
    int y;
    int dir;
} p;
char dir[4] = {‘v‘,‘>‘,‘^‘,‘<‘};
//写为下、右、上、左是为了turn back操作
int dx[4] = {1,0,-1,0};
int dy[4] = {0,1,0,-1};

int vis(int x, int y)
{
    if(x<1 || x>8)
        return 0;
    if(y<1 || y>8)
        return 0;
    return 1;
}
void DFS(int x, int y)
{
    if(mm[x][y]==‘.‘)
    {
        mm[x][y]=mm[x-dx[p.dir]][y-dy[p.dir]];
        mm[x-dx[p.dir]][y-dy[p.dir]]=‘.‘;
    }
    else
    {
        DFS(x+dx[p.dir],y+dy[p.dir]);
        mm[x][y]=mm[x-dx[p.dir]][y-dy[p.dir]];
        mm[x-dx[p.dir]][y-dy[p.dir]]=‘.‘;
    }
}
void Rush()
{
    for(int i = 0; i <= 8; i++)
    {
        //初始化棋盘外的一圈全为‘.‘
        mm[0][i]=mm[i][0]=mm[9][i]=mm[i][9]=‘.‘;
    }
    mm[p.x][p.y] = ‘.‘;
    if(!vis(p.x+dx[p.dir],p.y+dy[p.dir]))
        return ;
    DFS(p.x+dx[p.dir],p.y+dy[p.dir]);
    p.x += dx[p.dir];
    p.y += dy[p.dir];
}

int main()
{
    char a[maxn], b[maxn];
    int step;
    while(scanf("%s",mm[1]+1))
    {
        if(mm[1][1] == ‘-‘)
            break;
        for(int i = 2; i <= 8; i++)
        {
            scanf("%s",mm[i]+1);
        }
        for(int i = 1; i <= 8; i++)
        {
            for(int j = 1; j <= 8; j++)
            {
                if(mm[i][j] == ‘v‘)
                {
                    p.x = i,p.y = j,p.dir = 0;
                }
                else if(mm[i][j] == ‘>‘)
                {
                    p.x = i,p.y = j,p.dir = 1;
                }
                else if(mm[i][j] == ‘^‘)
                {
                    p.x = i,p.y = j,p.dir = 2;
                }
                else if(mm[i][j] == ‘<‘)
                {
                    p.x = i,p.y = j,p.dir = 3;
                }
            }
        }
        while(scanf("%s",a))
        {
            if(a[0] == ‘#‘)
                break;
            if(a[0] == ‘t‘)
            {
                scanf("%s",b);
                if(b[0] == ‘l‘)
                    p.dir=(p.dir+1)%4;
                else if(b[0]==‘r‘)
                    p.dir=(p.dir+3)%4;
                else
                    p.dir=(p.dir+2)%4;
            }
            else
            {
                scanf("%d",&step);
                for(int i = 0; i < step; i++)
                {
                    Rush();
                }
            }
        }
        mm[p.x][p.y] = dir[p.dir];
        for(int i = 1; i <= 8; i++)
        {
            for(int j = 1; j <= 8; j++)
            {
                printf("%c",mm[i][j]);
            }
            printf("\n");
        }
        printf("\n");
    }
    return 0;
}
时间: 2024-10-10 04:34:57

POJ 3344 &amp; 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 le

POJ 3344 &amp; HDU 2414 Chessboard Dance(模拟)

题目链接: PKU:http://poj.org/problem?id=3344 HDU:http://acm.hdu.edu.cn/showproblem.php?pid=2414 Description Another boring Friday afternoon, Betty the Beetle thinks how to amuse herself. She goes out of her hiding place to take a walk around the living r

HDU 2414 Chessboard Dance(模拟题,仅此纪念我的堕落)

题目 模拟题也各种wa,我最近真的堕落了,,,,,智商越来越为负数了!!!!!!!! #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; char mp[10][10]; int d=-1;//0shang,1xia,2zuo,3you int x,y;//weizhi int weizhi(int i,int j) { if(mp[i][j]=='<'){x=

【HDOJ】2414 Chessboard Dance

简单DFS. 1 /* 2414 */ 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 6 const int n = 8; 7 char map[10][10]; 8 int x, y, d; 9 char dirs[5] = "^v<>"; 10 int dir[4][2] = { 11 -1,0, 1,0, 0,-1, 0,1 12 }; 13 int

hdu 1175 连连看(模拟循环队列)

连连看 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 18149    Accepted Submission(s): 4741 Problem Description "连连看"相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以通过一条线连起来(这条

HDU 4608 I-number--简单模拟

I-number Time Limit: 5000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 The I-number of x is defined to be an integer y, which satisfied the the conditions below: 1.  y>x; 2.  the sum of each digit of y(under base 10) is the multiple of 10; 3.  among all

hdu 4831 Scenic Popularity(模拟)

题目链接:hdu 4831 Scenic Popularity 题目大意:略. 解题思路:对于休闲区g[i][0]和g[i][1]记录的是最近的两个景点的id(只有一个最近的话g[i][1]为0),对于景点来说,g[i][0]为-1(表示该id对应的是景点),g[i][1]为该景点的热度值.主要就是模拟,注意一些细节就可以了. #include <cstdio> #include <cstring> #include <cstdlib> #include <alg

POJ 1159 Palindrome &amp;&amp; HDU 1159 Common Subsequence

1.先说说杭电的1159吧! 这道题是基础动规,比较简单! 就是要你求最长的公共子序列(不要优化) 动态转移方程: dp[i+1][j+1]=(a[i]=b[i])?dp[i][j]+1:max(dp[i+1][j],dp[i][j+1]) AC代码: #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define N 520 char a[N],b[N]; in

hdu 3125 Slash(模拟)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3125 Problem Description The American English slash (/) is a punctuation mark. In the early modern period, in the Fraktur script, which was widespread through Europe in the Middle Ages, one slash(/) repr