搜索题,一步一步模拟就行。。。不知道我方法有问题还是什么的,敲了500行,过了。。
注意一下 格式的控制
一开始想 的是 走步 算一个函数,判断是否可走是一个函数
之后发现太麻烦了,走路和判断放在一起
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<map>
#include<vector>
#include<stack>
#include<queue>
#include<set>
#include<list>
#include<cmath>
using namespace std;
typedef long long LL;
#define ALL(x) x.begin(),x.end()
char Map[10][10];
int turn;
bool solve(int x,int y,int t){
/*8个方向*/
/*上*/
int pos ;
int ans = 0;
int ok = 0;
for(int i = x - 1; i >= 0 ; i --){
if(turn == 0) /*黑子走的话*/{
if(Map[i][y] == 'B'){
ok = 1;
pos = i;
break;
}
}
else if(turn == 1)/*白子走的话*/{
if(Map[i][y] == 'W'){
ok = 1;
pos = i;
break;
}
}
}
if(ok && turn == 0){ /*黑色先走的话*/
int have_white = 0;
int is_ok = 1;
for(int i = pos + 1 ; i < x ; i++){
if(Map[i][y] == 'W') have_white = 1;
else {
is_ok = 0;
break;
}
}
if(is_ok && have_white) {
if(t == 1) /*如果需要修改*/{
for(int j = pos + 1; j < x ; j++) Map[j][y] = 'B';
}
ans = 1;
}
}
else if(ok && turn == 1){ /*白色先走的话*/
int have_white = 0;
int is_ok = 1;
for(int i = pos + 1 ; i < x ; i++){
if(Map[i][y] == 'B') have_white = 1;
else {
is_ok = 0;
break;
}
}
if(is_ok && have_white) {
if(t == 1)
for(int j = pos + 1; j < x ; j ++) Map[j][y] = 'W';
ans = 1;
}
}
/*======================================*/
/*下*/
ok = 0;
for(int i = x + 1; i < 8 ; i ++){
if(turn == 0) /*黑子走的话*/{
if(Map[i][y] == 'B'){
ok = 1;
pos = i;
break;
}
}
else if(turn == 1)/*白子走的话*/{
if(Map[i][y] == 'W'){
ok = 1;
pos = i;
break;
}
}
}
if(ok && turn == 0){ /*黑色先走的话*/
int have_white = 0;
int is_ok = 1;
for(int i = pos - 1 ; i > x ; i--){
if(Map[i][y] == 'W') have_white = 1;
else {
is_ok = 0;
break;
}
}
if(is_ok && have_white) {
if(t == 1)
for(int j = pos - 1; j > x ; j --) Map[j][y] = 'B';
ans = 1;
}
}
else if(ok && turn == 1){ /*白色先走的话*/
int have_white = 0;
int is_ok = 1;
for(int i = pos - 1 ; i > x ; i--){
if(Map[i][y] == 'B') have_white = 1;
else {
is_ok = 0;
break;
}
}
if(is_ok && have_white) {
if(t == 1)
for(int j = pos - 1; j > x ; j --) Map[j][y] = 'W';
ans = 1;
}
}
/*==============================================*/
/*左*/
ok = 0;
for(int i = y - 1; i >= 0; i --){
if(turn == 0) /*黑子走的话*/{
if(Map[x][i] == 'B'){
ok = 1;
pos = i;
break;
}
}
else if(turn == 1)/*白子走的话*/{
if(Map[x][i] == 'W'){
ok = 1;
pos = i;
break;
}
}
}
if(ok && turn == 0){ /*黑色先走的话*/
int have_white = 0;
int is_ok = 1;
for(int i = pos + 1 ; i < y ; i ++){
if(Map[x][i] == 'W') have_white = 1;
else {
is_ok = 0;
break;
}
}
if(is_ok && have_white) {
if(t == 1)
for(int j = pos + 1; j < y ; j ++) Map[x][j] = 'B';
ans = 1;
}
}
else if(ok && turn == 1){ /*白色先走的话*/
int have_white = 0;
int is_ok = 1;
for(int i = pos + 1 ; i < y ; i ++){
if(Map[x][i] == 'B') have_white = 1;
else {
is_ok = 0;
break;
}
}
if(is_ok && have_white) {
if(t == 1)
for(int j = pos + 1; j < y ; j ++) Map[x][j] = 'W';
ans = 1;
}
}
/*=================================================*/
/*右*/
ok = 0;
for(int i = y + 1; i < 8; i ++){
if(turn == 0) /*黑子走的话*/{
if(Map[x][i] == 'B'){
ok = 1;
pos = i;
break;
}
}
else if(turn == 1)/*白子走的话*/{
if(Map[x][i] == 'W'){
ok = 1;
pos = i;
break;
}
}
}
if(ok && turn == 0){ /*黑色先走的话*/
int have_white = 0;
int is_ok = 1;
for(int i = pos - 1 ; i > y ; i --){
if(Map[x][i] == 'W') have_white = 1;
else {
is_ok = 0;
break;
}
}
if(is_ok && have_white) {
if(t == 1)
for(int j = pos - 1; j > y ; j --) Map[x][j] = 'B';
ans = 1;
}
}
else if(ok && turn == 1){ /*白色先走的话*/
int have_white = 0;
int is_ok = 1;
for(int i = pos - 1 ; i > y ; i --){
if(Map[x][i] == 'B') have_white = 1;
else {
is_ok = 0;
break;
}
}
if(is_ok && have_white) {
if(t == 1)
for(int j = pos - 1; j > y ; j --) Map[x][j] = 'W';
ans = 1;
}
}
/*=================================*/
/*左上*/
int pos_x,pos_y;
ok = 0;
for(int i = x - 1, j = y - 1; i >= 0 && j >= 0; i --, j --){
if(turn == 0) /*黑子走的话*/{
if(Map[i][j] == 'B'){
ok = 1;
pos_x = i;
pos_y = j;
break;
}
}
else if(turn == 1)/*白子走的话*/{
if(Map[i][j] == 'W'){
ok = 1;
pos_x = i;
pos_y = j;
break;
}
}
}
if(ok && turn == 0){ /*黑色先走的话*/
int have_white = 0;
int is_ok = 1;
for(int i = pos_x + 1 , j = pos_y + 1; i < x && j < y ; i ++ , j++){
if(Map[i][j] == 'W') have_white = 1;
else {
is_ok = 0;
break;
}
}
if(is_ok && have_white) {
if(t == 1)
for(int a = pos_x + 1 , b = pos_y + 1; a < x && b < y ; a ++ , b++)
Map[a][b] = 'B';
ans = 1;
}
}
else if(ok && turn == 1){ /*白色先走的话*/
int have_white = 0;
int is_ok = 1;
for(int i = pos_x + 1 , j = pos_y + 1; i < x && j < y ; i ++ , j ++){
if(Map[i][j] == 'B') have_white = 1;
else {
is_ok = 0;
break;
}
}
if(is_ok && have_white) {
if(t == 1)
for(int a = pos_x + 1 , b = pos_y + 1; a < x && b < y ; a ++ , b++)
Map[a][b] = 'W';
ans = 1;
}
}
/*========================================*/
/*右下*/
ok = 0;
for(int i = x + 1, j = y + 1; i < 8 && j < 8; i ++, j ++){
if(turn == 0) /*黑子走的话*/{
if(Map[i][j] == 'B'){
ok = 1;
pos_x = i;
pos_y = j;
break;
}
}
else if(turn == 1)/*白子走的话*/{
if(Map[i][j] == 'W'){
ok = 1;
pos_x = i;
pos_y = j;
break;
}
}
}
if(ok && turn == 0){ /*黑色先走的话*/
int have_white = 0;
int is_ok = 1;
for(int i = pos_x - 1 , j = pos_y - 1; i > x && j > y ; i -- , j--){
if(Map[i][j] == 'W') have_white = 1;
else {
is_ok = 0;
break;
}
}
if(is_ok && have_white) {
if(t == 1)
for(int a = pos_x - 1 , b = pos_y - 1; a > x && b > y ; a -- , b--)
Map[a][b] = 'B';
ans = 1;
}
}
else if(ok && turn == 1){ /*黑色先走的话*/
int have_white = 0;
int is_ok = 1;
for(int i = pos_x - 1 , j = pos_y - 1; i > x && j > y ; i -- , j--){
if(Map[i][j] == 'B') have_white = 1;
else {
is_ok = 0;
break;
}
}
if(is_ok && have_white) {
if(t == 1)
for(int a = pos_x - 1 , b = pos_y - 1; a > x && b > y ; a -- , b--)
Map[a][b] = 'W';
ans = 1;
}
}
/*=================================================*/
/*右上*/
ok = 0;
for(int i = x - 1, j = y + 1; i >= 0 && j < 8; i --, j ++){
if(turn == 0) /*黑子走的话*/{
if(Map[i][j] == 'B'){
ok = 1;
pos_x = i;
pos_y = j;
break;
}
}
else if(turn == 1)/*白子走的话*/{
if(Map[i][j] == 'W'){
ok = 1;
pos_x = i;
pos_y = j;
break;
}
}
}
if(ok && turn == 0){ /*黑色先走的话*/
int have_white = 0;
int is_ok = 1;
for(int i = pos_x + 1 , j = pos_y - 1; i < x && j > y ; i ++ , j--){
if(Map[i][j] == 'W') have_white = 1;
else {
is_ok = 0;
break;
}
}
if(is_ok && have_white) {
if(t == 1)
for(int a = pos_x + 1 , b = pos_y - 1; a < x && b > y ; a ++ , b--)
Map[a][b] = 'B';
ans = 1;
}
}
else if(ok && turn == 1){ /*黑色先走的话*/
int have_white = 0;
int is_ok = 1;
for(int i = pos_x + 1 , j = pos_y - 1; i < x && j > y ; i ++ , j--){
if(Map[i][j] == 'B') have_white = 1;
else {
is_ok = 0;
break;
}
}
if(is_ok && have_white) {
if(t == 1)
for(int a = pos_x + 1 , b = pos_y - 1; a < x && b > y ; a ++ , b--)
Map[a][b] = 'W';
ans = 1;
}
}
/*=================================左下*/
ok = 0;
for(int i = x + 1, j = y - 1; i < 8 && j >= 0; i ++, j --){
if(turn == 0) /*黑子走的话*/{
if(Map[i][j] == 'B'){
ok = 1;
pos_x = i;
pos_y = j;
break;
}
}
else if(turn == 1)/*白子走的话*/{
if(Map[i][j] == 'W'){
ok = 1;
pos_x = i;
pos_y = j;
break;
}
}
}
if(ok && turn == 0){ /*黑色先走的话*/
int have_white = 0;
int is_ok = 1;
for(int i = pos_x - 1 , j = pos_y + 1; i > x && j < y ; i -- , j++){
if(Map[i][j] == 'W') have_white = 1;
else {
is_ok = 0;
break;
}
}
if(is_ok && have_white) {
if(t == 1)
for(int a = pos_x - 1 , b = pos_y + 1; a > x && b < y ; a -- , b ++)
Map[a][b] = 'B';
ans = 1;
}
}
else if(ok && turn == 1){ /*黑色先走的话*/
int have_white = 0;
int is_ok = 1;
for(int i = pos_x - 1 , j = pos_y + 1; i > x && j < y ; i -- , j++){
if(Map[i][j] == 'B') have_white = 1;
else {
is_ok = 0;
break;
}
}
if(is_ok && have_white) {
if(t == 1)
for(int a = pos_x - 1 , b = pos_y + 1; a > x && b < y ; a -- , b ++)
Map[a][b] = 'W';
ans = 1;
}
}
if(ans == 0)
return false;
else {
if(t == 1){
if(turn == 0)
Map[x][y] = 'B';
else
Map[x][y] = 'W';
}
return true;
}
}
int count_black ;
int count_white ;
void Get_Number(){
for(int i = 0 ; i < 8 ; i ++)
for(int j = 0 ; j < 8 ; j ++)
if(Map[i][j] == 'W') count_white++;
else
if(Map[i][j] == 'B') count_black++;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
for(int i = 0 ; i < 8 ; i++)
scanf("%s",Map[i]);
char str[10];
while(scanf("%s",str)){
if(str[0] == 'Q') {
for(int i = 0 ; i < 8 ; i++)
puts(Map[i]);
break;
}
if(str[0] == 'W') turn = 1; /*白色为1*/
else if(str[0] == 'B') turn = 0; /*黑色为0*/
else if(str[0] == 'L'){ /*遍历所有的点*/
int ok = 0;
for(int i = 0 ; i < 8 ; i++)
for(int j = 0 ; j < 8 ; j++)
if(Map[i][j] == '-' && solve(i,j,0)){
if(ok)
printf(" (%d,%d)",i + 1, j + 1);
else{
printf("(%d,%d)",i + 1, j + 1);
ok = 1;
}
}
if(!ok) printf("No legal move.");
printf("\n");
}
else if(str[0] == 'M'){
int x = str[1] - '0';
int y = str[2] - '0';
int t = solve(x - 1,y - 1,1);
if(t){
count_black = 0;
count_white = 0;
Get_Number();
}
else {
if(turn == 1) turn = 0;
else if(turn == 0) turn = 1;
solve(x - 1,y - 1,1);
count_black = 0;
count_white = 0;
Get_Number();
}
printf("Black -%3d White -%3d\n",count_black,count_white);
if(turn == 1) turn = 0;
else if(turn == 0) turn = 1;
}
}
if(T > 0) printf("\n");
}
return 0;
}