Stake Your Claim

// ConsoleApplication1.cpp: 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <cstring>
#include <cstdio>
#define INF 1000000
using namespace std;
int Map[8][8], vis[8][8], N, xx[4] = { 0, 0, 1, -1 }, yy[4] = {1, -1, 0, 0}, score0, score1, X, Y;
void DFS(int num, int m, int n, int *s) {
 for (int i = 0; i < 4; ++i) {
  int x, y;
  x = m + xx[i];
  y = n + yy[i];
  if (x >= 0 && x < N && y >= 0 && y < N && !vis[x][y] && Map[x][y] == num) {
   *s = *s + 1;
   vis[x][y] = 1;
   DFS(num, x, y, s);
  }
 }
}

int alpha_beta(int cnt, int player, int alpha, int beta, int now_cnt, int now_player) {
 int i, j, val;
 if (cnt == N * N) {
  score0 = score1 = 0;
  memset(vis, 0, sizeof(vis));
  for (int i = 0; i < N; ++i)
   for (int j = 0; j < N; ++j) {
    if (Map[i][j] == 1 && !vis[i][j]) {
     vis[i][j] = 1;
     int score = 1;
     DFS(1, i, j, &score);
     if (score > score0)
      score0 = score;
    }
    if (Map[i][j] == 2 && !vis[i][j]) {
     vis[i][j] = 1;
     int score = 1;
     DFS(2, i, j, &score);
     if (score > score1)
      score1 = score;
    }
   }
  return score0 - score1;
 }
 if (player == 0) {
  for (i = 0; i < N; ++i)
   for (int j = 0; j < N; ++j) {
    if (Map[i][j])
     continue;
    Map[i][j] = 1;
    val = alpha_beta(cnt + 1, 1 - player, alpha, beta, now_cnt, now_player);
    Map[i][j] = 0;
    if (val > alpha) {
     alpha = val;
     if (now_player == 0 && cnt == now_cnt) {
      X = i;
      Y = j;
     }
    }
    if (alpha >= beta)
     return alpha;
   }
  return alpha;
 }
 else {
  for (i = 0; i < N; ++i)
   for (int j = 0; j < N; ++j) {
    if (Map[i][j])
     continue;
    Map[i][j] = 2;
    val = alpha_beta(cnt + 1, 1 - player, alpha, beta, now_cnt, now_player);
    Map[i][j] = 0;
    if (val < beta) {
     beta = val;
     if (now_player == 1 && cnt == now_cnt) {
      X = i;
      Y = j;
     }
    }
    if (alpha >= beta)
     return beta;
   }
  return beta;
 }
}
int main()
{
 int  S0, S1, cnt;
 char ch;
 while (cin >> N) {
  if (N == 0)
   break;
  S0 = S1 = cnt = 0;
  memset(Map, 0, sizeof(Map));
  for (int i = 0; i < N; ++i) {
   for (int j = 0; j < N; ++j) {
    cin >> ch;
    if (ch == '0') {
     cnt++;
     S0++;
     Map[i][j] = 1;
    }
    else if (ch == '1') {
     cnt++;
     S1++;
     Map[i][j] = 2;
    }
    else
        Map[i][j] = 0;
   }
  }
  if (S0 == S1) {
   int score0 = alpha_beta(cnt, 0, -INF, INF, cnt, 0);
   printf("(%d,%d) %d\n", X, Y, score0);
  }
  else {
   int score1 = alpha_beta(cnt, 1, -INF, INF, cnt, 1);
   printf("(%d,%d) %d\n", X, Y, -score1);
  }
 }
    return 0;
}


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值