【luogu2033】【模拟】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
........
........
........
........
........
........
........

解题思路

纯模拟,在处理转弯的时候需要小注意一下,因为棋盘只有8x8,所以推棋子时暴力推就好了


Code
#include <iostream>
#include <cstdio>
#include <string>

using namespace std;

const int way[5][2] = {{0, 0}, {-1, 0}, {0, -1}, {1, 0}, {0, 1}};//方向
int x, y, z, k;
char a[10][10], c, t;
string s;

bool check (int x, int y){//判断是否超界
	return (x > 0 && x <= 8 && y > 0 && y <= 8);
}

bool checka (char c){//判断是不是字母
	return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z');
}

int kay (char c){//由于没用map,所以就把字符方向转成数字方向下标
	if (c == '^') return 1;
	if (c == '<') return 2;
	if (c == 'v') return 3;
	if (c == '>') return 4;
	return 0; 
}

char key (int x){//在棋盘中要把数字方向转成字符方向
	if (x == 1) return '^';
	if (x == 2) return '<';
	if (x == 3) return 'v';
	if (x == 4) return '>';
}

void move (int s, int z){
	while (check (x + way[z][0], y + way[z][1]) && (s--))
	{
		a[x][y] = '.';
		x += way[z][0], y += way[z][1];//往前走
		if (checka (a[x][y]))//如果碰到了棋子
		{
			int xx = x, yy = y, c = a[xx][yy];
			while (check (xx + way[z][0], yy + way[z][1]) && checka (c))//暴力往前推
			{
				xx += way[z][0], yy += way[z][1];
				t = a[xx][yy], a[xx][yy] = c, c = t;
			}
		}
	}
	a[x][y] = key(z);
}

int main(){
	for (int i = 1; i <= 8; i++)
		for (int j = 1; j <= 8; j++)
		{
			cin >> a[i][j];
			if (kay (a[i][j]))
			{
				x = i, y = j;
				z = kay(a[i][j]);
			}
		}
	cin >> s;
	while (s != "#")
	{
		if (s == "move")
		{
			scanf ("%d", &k);
			move(k, z);
		}else
		{
			cin >> s;
			if (s == "left")
			{
				z++;
				if (z == 5) z = 1;
				a[x][y] = key(z);
			}else
			if (s == "right")
			{
				z--;
				if (z == 0) z = 4;
				a[x][y] = key(z);
			}else
			{
				z--;
				if (z == 0) z = 4;
				z--;
				if (z == 0) z = 4;
				a[x][y] = key(z);
			}
		}
		cin >> s;
	}
	for (int i = 1; i <= 8; i++)
	{
		for (int j = 1; j <= 8; j++)
			printf ("%c", a[i][j]);
		printf ("\n");
	}
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值