黑白棋
题意就是模拟下棋,
L:查询当前合法的下子位置,若无,特殊输出,若有,输出在一行。
MXX:先判当前棋手是否有合法的下子位置,若无自动换人,然后下子,再换人(再换人这部分题目里没有说但是根据测试数据2可以推断出来)。
若有合法位置,下子,换人。
两种都要输出下子结束后双方棋的个数,注意格式为“Black - %2d White - %2d”。
Q:结束当前棋局并打印棋盘。
注意输出格式。
注意每个棋盘之间有空行,第一个之前没有空行,最后一个之后也没有空行。
其实不难,就是很烦。
上代码
#include <iostream>
#include<string>
#include<stack>
#include<queue>
#include<vector>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<limits>
#include<limits.h>
#include<algorithm>
using namespace std;
int maze[11][11];
int cur;
int dir[8][2]={{1,0},{0,1},{0,-1},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}};
bool ma[11][11];
void numm(){
int b=0,w=0;
for(int i=1;i<=8;i++){
for(int j=1;j<=8;j++){
if(maze[i][j]==1)w++;
if(maze[i][j]==-1)b++;
}
}
printf("Black - %2d White - %2d\n",b,w);
}
bool lista(){
bool f=false;
memset(ma,false,sizeof(ma));
for(int i=1;i<=8;i++){
for(int j=1;j<=8;j++){
if(maze[i][j]!=cur)continue;
for(int k=0;k<8;k++){
int x=i+dir[k][0];
int y=j+dir[k][1];
if(maze[x][y]!=cur*(-1))continue;
while(true){
x+=dir[k][0];
y+=dir[k][1];
if(x<1||x>8||y<1||y>8)break;
if(maze[x][y]==0){
f=true;
ma[x][y]=true;
break;
}
if(maze[x][y]==cur)break;
if(maze[x][y]==cur*(-1))continue;
}
}
}
}
return f;
}
void mova(int a,int b){
maze[a][b]=cur;
for(int k=0;k<8;k++){
int x=a+dir[k][0];
int y=b+dir[k][1];
if(maze[x][y]!=cur*(-1))continue;
while(true){
x+=dir[k][0];
y+=dir[k][1];
if(x<1||x>8||y<1||y>8)break;
if(maze[x][y]==0)break;
if(maze[x][y]==cur){
int xx=a,yy=b;
while(xx!=x||yy!=y){
xx+=dir[k][0];
yy+=dir[k][1];
maze[xx][yy]=cur;
}
break;
}
if(maze[x][y]==cur*(-1))continue;
}
}
}
void movee(int a,int b){
bool u=lista();
if(u){
mova(a,b);
numm();
cur*=-1;
}else {
cur*=-1;
mova(a,b);
numm();
cur*=-1;
}
}
void printma(){
bool l=false;
for(int i=1;i<=8;i++){
for(int j=1;j<=8;j++){
if(ma[i][j]&&l){
printf(" (%d,%d)",i,j);
}
if(ma[i][j]&&!l){
printf("(%d,%d)",i,j);
l=true;
}
}
}
printf("\n");
}
void print(){
for(int i=1;i<=8;i++){
for(int j=1;j<=8;j++){
if(maze[i][j]==0)printf("-");
if(maze[i][j]==1)printf("W");
if(maze[i][j]==-1)printf("B");
}
printf("\n");
}
}
void inita(){
memset(maze,0,sizeof(maze));
cur=0;
}
int main()
{
int N;
char c;
cin>>N;
bool h=false;
while(N--){
if(h)printf("\n");
h=true;
inita();
for(int i=1;i<=8;i++){
for(int j=1;j<=8;j++){
cin>>c;
if(c=='-')maze[i][j]=0;
if(c=='B'){
maze[i][j]=-1;
}
if(c=='W'){
maze[i][j]=1;
}
}
}
cin>>c;
if(c=='B')cur=-1;
if(c=='W')cur=1;
while(true){
cin>>c;
if(c=='Q'){
print();
break;
}
if(c=='L'){
if( lista())printma();
else printf("No legal move.\n");
}
if(c=='M'){
int a,b;
cin>>c;
a=c-'0';
cin>>c;
b=c-'0';
movee(a,b);
}
}
}
return 0;
}