洛谷 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

 

 

转载于:https://www.cnblogs.com/cangT-Tlan/p/9722400.html

  • 0
    点赞
  • 0
    收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页
评论
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值