博客
关于我
【luogu2033】【模拟】Chessboard Dance
阅读量:319 次
发布时间:2019-03-04

本文共 2334 字,大约阅读时间需要 7 分钟。

题目描述

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

操作有四种,描述如下:

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

turn left 向左转90度

turn right 向右转90度

turn back 向后转

输入格式

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

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

输出格式

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

输入输出样例
输入 #1
......bA.....^..................................................move 2turn rightmove 1#
输出 #1
......>b........................................................

解题思路

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


Code

#include 
#include
#include
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"); }}

转载地址:http://wuiq.baihongyu.com/

你可能感兴趣的文章
Nginx做反向代理时访问端口被自动去除
查看>>
Nginx入门教程-简介、安装、反向代理、负载均衡、动静分离使用实例
查看>>
Nginx入门简介和反向代理、负载均衡、动静分离理解
查看>>
nginx入门篇----nginx服务器基础配置
查看>>
nginx反向代理
查看>>
Nginx反向代理
查看>>
nginx反向代理、文件批量改名及统计ip访问量等精髓总结
查看>>
Nginx反向代理与正向代理配置
查看>>
Nginx反向代理及负载均衡实现过程部署
查看>>
Nginx反向代理和负载均衡部署指南
查看>>
Nginx反向代理是什么意思?如何配置Nginx反向代理?
查看>>
nginx反向代理解决跨域问题,使本地调试更方便
查看>>
nginx反向代理转发、正则、重写、负摘均衡配置案例
查看>>
Nginx反向代理配置
查看>>
Nginx启动SSL功能,并进行功能优化,你看这个就足够了
查看>>
nginx启动脚本
查看>>
Nginx和Tomcat的区别
查看>>
Nginx在Windows上和Linux上(Docker启动)分别配置基本身份认证示例
查看>>
Nginx在Windows下载安装启动与配置前后端请求代理
查看>>
Nginx在开发中常用的基础命令
查看>>