洛谷 P2033 Chessboard Dance

题目描述

在棋盘上跳舞是件有意思的事情。现在给你一张国际象棋棋盘和棋盘上的一些子以及你的初始位置和方向。求按一定操作后,棋盘的状态。

操作有四种,描述如下:

move n n是非负整数,表示你按目前所在方向前进n步,如果即将走出棋盘,则停止。如果面前有棋子,则将其向前推一步。

turn left 向左转90度

turn right 向右转90度

turn back 向后转

输入输出格式

输入格式:

 

输入前8行,每行8个字符,给出棋盘状态。“.”表示该格为空,字母表示棋子,不同字母表示不同的棋子。你所在位置用“^”、“<”、“>”、“v”四个字母中一个表示,分别表示你的方向上、左、右、下。

接下来有若干行,每行一个操作。以“#”结束。操作数不超过1000个。

 

输出格式:

 

输出8行,每行8个字符,表示经过一系列操作后棋盘和你的状态。表示方法同输入。

 

输入输出样例

输入样例#1: 复制
......bA
.....^..
........
........
........
........
........
........
move 2
turn right
move 1
#
输出样例#1: 复制
......>b
........
........
........
........
........
........
........
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int sx,sy,turn;
char map[90][90];
char s[100];
int dx[5]={0,0,0,-1,1};
int dy[5]={0,-1,1,0,0};
void work(int num,int i){
    char que,aim;
    while(num){
        num--;
        if(sx+dx[i]<1||sx+dx[i]>8||sy+dy[i]<1||sy+dy[i]>8)    break;
        if(map[sx+dx[i]][sy+dy[i]]=='.'){
            swap(map[sx][sy],map[sx+dx[i]][sy+dy[i]]);
            sx+=dx[i];sy+=dy[i];
        }
        else{
            que=map[sx+dx[i]][sy+dy[i]];
            map[sx+dx[i]][sy+dy[i]]=map[sx][sy];
            map[sx][sy]='.';sx+=dx[i];sy+=dy[i];
            int x=sx,y=sy,f=0;;
            while(map[x+dx[i]][y+dy[i]]!='.'&&x+dx[i]>=1&&x+dx[i]<=8&&y+dy[i]>=1&&y+dy[i]<=8){
                aim=map[x+dx[i]][y+dy[i]];
                map[x+dx[i]][y+dy[i]]=que;
                que=aim;f=1;x+=dx[i];y+=dy[i];
            }
            map[x+dx[i]][y+dy[i]]=que;
        }
    }
}
int main(){
    for(int i=1;i<=8;i++)
        for(int j=1;j<=8;j++){
            cin>>map[i][j];
            if(map[i][j]=='<')    turn=1,sx=i,sy=j;
            else if(map[i][j]=='>')    turn=2,sx=i,sy=j;
            else if(map[i][j]=='^')    turn=3,sx=i,sy=j;
            else if(map[i][j]=='v')    turn=4,sx=i,sy=j; 
        }
    while(1){
        cin>>s;
        if(s[0]=='m'){
            int pos;cin>>pos;
            work(pos,turn);
        }
        else if(s[0]=='t'){
            char ss[10];
            cin>>ss;
            if(ss[0]=='l'){
                if(turn==1)    turn=4,map[sx][sy]='v';
                else if(turn==2)    turn=3,map[sx][sy]='^';
                else if(turn==3)    turn=1,map[sx][sy]='<';
                else if(turn==4)    turn=2,map[sx][sy]='>';
            }
            else if(ss[0]=='r'){
                if(turn==1)    turn=3,map[sx][sy]='^';
                else if(turn==2)    turn=4,map[sx][sy]='v';
                else if(turn==3)    turn=2,map[sx][sy]='>';
                else if(turn==4)    turn=1,map[sx][sy]='<';
            }
            else if(ss[0]=='b'){
                if(turn==1)    turn=2,map[sx][sy]='>';
                else if(turn==2)    turn=1,map[sx][sy]='<';
                else if(turn==3)    turn=4,map[sx][sy]='v';
                else if(turn==4)    turn=3,map[sx][sy]='^';
            }
        }
        else if(s[0]=='#'){
            for(int i=1;i<=8;i++){
                for(int j=1;j<=8;j++)
                    cout<<map[i][j];
                cout<<endl;
            }
            return 0;
        }
    }
}
100

 

 
posted @ 2018-09-29 10:39  一蓑烟雨任生平  阅读(137)  评论(0编辑  收藏  举报