220 Othello

搜索题,一步一步模拟就行。。。不知道我方法有问题还是什么的,敲了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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值