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("\n");
		//	printf("%s\n",m[i]+1);
	}
	return 0;
}

猜你喜欢

转载自www.cnblogs.com/mysh/p/11781087.html