P2033 Chessboard Dance
Posted mysh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int N=10; const int xx[]= {-1,0,1,0}; const int yy[]= {0,-1,0,1}; const char u[]= {‘^‘,‘<‘,‘v‘,‘>‘}; int x,y,d,s; char m[N][N]; char o[N],p[N]; bool check(int x,int y) { return (1<=x&&x<=8&&1<=y&&y<=8); } int main () { //freopen("CD.in","r",stdin); //freopen("CD.out","w",stdout); for(int i=1; i<=8; i++) { scanf("%s",m[i]+1); for(int j=1; j<=8; j++) for(int k=0; k<4; k++) if(m[i][j]==u[k]) x=i,y=j,d=k; } while(scanf("%s",o+1),o[1]!=‘#‘) { if(o[1]==‘m‘) { scanf("%d",&s); int tx=x+xx[d],ty=y+yy[d]; while(s&&check(tx,ty)) { if (m[tx][ty] != ‘.‘) { int dx=tx+xx[d],dy=ty+yy[d]; while(check(dx,dy)&&m[dx][dy]!=‘.‘) dx+=xx[d],dy+=yy[d]; while(dx!=tx||dy!=ty) { m[dx][dy]=m[dx-xx[d]][dy-yy[d]]; dx-=xx[d],dy-=yy[d]; } } m[tx][ty]=m[x][y]; m[x][y]=‘.‘; x=tx,y=ty; tx+=xx[d],ty+=yy[d]; --s; } } else { scanf("%s",p+1); if(p[1]==‘l‘) d=(d+1)%4; else if(p[1]==‘r‘) d=(d+3)%4; else d=(d+2)%4; m[x][y]=u[d]; } } for(int i=1; i<=8; i++) { for(int j=1; j<=8; j++) printf("%c",m[i][j]); printf(" "); // printf("%s ",m[i]+1); } return 0; }
以上是关于P2033 Chessboard Dance的主要内容,如果未能解决你的问题,请参考以下文章
POJ 3344 & HDU 2414 Chessboard Dance(模拟)
UVALive 2031Dance Dance Revolution