Chessboard Dance
Posted tenderfoot
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Chessboard Dance相关的知识,希望对你有一定的参考价值。
题目描述
在棋盘上跳舞是件有意思的事情。现在给你一张国际象棋棋盘和棋盘上的一些子以及你的初始位置和方向。求按一定操作后,棋盘的状态。
操作有四种,描述如下:
move n n是非负整数,表示你按目前所在方向前进n步,如果即将走出棋盘,则停止。如果面前有棋子,则将其向前推一步。
turn left 向左转90度
turn right 向右转90度
turn back 向后转
输入格式
输入前8行,每行8个字符,给出棋盘状态。“.”表示该格为空,字母表示棋子,不同字母表示不同的棋子。你所在位置用“^”、“<”、“>”、“v”四个字母中一个表示,分别表示你的方向上、左、右、下。
接下来有若干行,每行一个操作。以“#”结束。操作数不超过1000个。
输出格式
输出8行,每行8个字符,表示经过一系列操作后棋盘和你的状态。表示方法同输入。
输入输出样例
输入
......bA .....^.. ........ ........ ........ ........ ........ ........ move 2 turn right move 1 #
输出
......>b
........
........
........
........
........
........
........
分析
如果前面是空地,直接向前走。
如果前面是字符,先遍历字符前面的点,如果遍历到一个空地再推
如果当前点到达了边界则break。
真就直接暴力模拟
多个棋子可以一起推
程序
#include <bits/stdc++.h> using namespace std; char s[10001][10001]; char situtation[4] = {‘^‘,‘v‘,‘<‘,‘>‘}; int direction = 0 , x , y; int direction_back[5] = {0 , 2 , 1 , 4 , 3}; int direction_right[5] = {0 , 4 , 3 , 1 , 2}; int direction_left[5] = {0 , 3 , 4 , 2 , 1}; void Go_Up(int k) { int x_next = x; int y_next = y; for(int i = x - 1; i >= 1; i--) { if(x_next == 1) break; if(!k) break; if(s[i][y] == ‘.‘) { x_next--; k--; continue; } if(s[i][y] != ‘.‘) { int flag = i; for(int j = i; j >= 1; j--) if(s[j][y] == ‘.‘ || j == 1) { flag = j; break; } for(int j = flag; j <= i; j++) s[j][y] =s [j + 1][y]; x_next--; k--; } } x = x_next; } void Go_Down(int k) { int x_next = x; int y_next = y; for(int i = x + 1; i <= 8; i++) { if(x_next == 8) break; if(!k) break; if(s[i][y] == ‘.‘) { x_next++; k--; continue; } if(s[i][y] != ‘.‘) { int flag = i; for(int j = i; j <= 8; j++) if(s[j][y] == ‘.‘ || j == 8) { flag = j; break; } for(int j = flag; j >= i; j--) s[j][y] = s[j - 1][y]; x_next++; k--; } } x = x_next; } void Go_Left(int k) { int y_next = y; for(int i = y - 1; i >= 1; i--) { if(y_next == 1) break; if(k == 0) break; if(s[x][i] == ‘.‘) { y_next--; k--; continue; } if(s[x][i] != ‘.‘) { int flag = i; for(int j = i; j >= 1; j--) { if(s[x][j] == ‘.‘||j == 1) { flag = j; break; } } for(int j = flag; j <= i; j++) s[x][j] = s[x][j + 1]; y_next--; k--; } } y = y_next; } void Go_Right(int k) { int y_next = y; for(int i = y + 1; i <= 8; i++) { if(y_next == 8) break; if(!k) break; if(s[x][i] == ‘.‘) { y_next++; k--; continue; } if(s[x][i] != ‘.‘) { int flag = i; for(int j = i; j <= 8; j++) { if(s[x][j] == ‘.‘ || j == 8) { flag = j; break; } } for(int j = flag; j >= i; j--) s[x][j] = s[x][j - 1]; y_next++; k--; } } y = y_next; } int main() { ios::sync_with_stdio(false); for(int i = 1; i <= 8; i++) for(int j = 1; j <= 8; j++) { cin >> s[i][j]; if(s[i][j] == ‘^‘) { direction=1; s[i][j] = ‘.‘; x = i; y = j; } if(s[i][j] == ‘v‘) { direction = 2; x = i; y = j; s[i][j] = ‘.‘; } if(s[i][j] == ‘<‘) { x = i; y = j; s[i][j] = ‘.‘; direction = 3; } if(s[i][j] == ‘>‘) { x = i; y = j; s[i][j] = ‘.‘; direction = 4; } } string a,b; int c; int t = 0; while(1) { cin >> a; if(a == "#") break; else if(a == "turn") { cin >> b; if(b == "right") direction = direction_right[direction]; else if(b == "left") direction = direction_left[direction]; else if(b == "back") direction = direction_back[direction]; } else if(a == "move") { cin >> c; if(direction == 1) Go_Up(c); else if(direction == 2) Go_Down(c); else if(direction == 3) Go_Left(c); else if(direction == 4) Go_Right(c); } } for(int i = 1; i <= 8; i++) { for(int j = 1; j <= 8; j++) { if(x == i && y == j) cout << situtation[direction - 1]; else cout << s[i][j]; } cout << endl; } return 0; }
以上是关于Chessboard Dance的主要内容,如果未能解决你的问题,请参考以下文章
POJ 3344 & HDU 2414 Chessboard Dance(模拟)
UVALive 2031Dance Dance Revolution