zoukankan      html  css  js  c++  java
  • ccf-棋局评估-20190304

    三更:  更短的代码,更短的时间,加油! 也祝你好运哦!!!!

    核心: dfs(player)  player下完之后最大得分

    优点: 我位运算掌握的还不错嘛 2和1如何转换  2^3=1; 1^3=2;   hh!  

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int inf = 0x3f3f3f3f;
     4 const int n = 3;
     5 int mp[5][5];
     6 int num;
     7 int judge () {
     8   int flag = 0;
     9   // if (num==9) return 0; // 平局   放在这里会错误
    10   for (int i = 1; i <= n && !flag; i++) {
    11     if (mp[i][1] && mp[i][1] == mp[i][2] && mp[i][2] == mp[i][3])  flag = mp[i][1] ;
    12     if (mp[1][i] && mp[1][i] == mp[2][i] && mp[2][i] == mp[3][i])  flag = mp[1][i] ;
    13   }
    14   if (mp[1][1] && mp[1][1] == mp[2][2] && mp[2][2] == mp[3][3])  flag = mp[1][1];
    15   if (mp[1][3] && mp[1][3] == mp[2][2] && mp[2][2] == mp[3][1])  flag = mp[1][3];
    16   if (flag) return 9 - num + 1;  
    17   if (num==9) return 0; // 平局
    18   else      return -1;  // 无胜负
    19 }
    20 int dfs (int p1) { // 选手p先手获得的最大分
    21   int x = judge();
    22   if (x >= 0)  return -x;
    23   x = inf;  int p2 = (p1 ^ 3);
    24   for (int i = 1; i <= n; i++)
    25     for (int j = 1; j <= n; j++) {
    26       if (!mp[i][j]) {
    27         mp[i][j] = p1; num++;
    28         x = min (x, dfs(p2));
    29         mp[i][j] = 0; num--;
    30       }
    31     }
    32   return -x;
    33 }
    34 int main ()
    35 {
    36   int T; cin >> T;
    37   while (T--) {
    38     num = 0;
    39     for (int i = 1; i <= n; i++)
    40       for (int j = 1; j <= n; j++) {
    41         cin >> mp[i][j];
    42         if (mp[i][j]) num++;
    43       }
    44     int ans = dfs (1);
    45     cout << ans << endl;
    46   }
    47   return 0;
    48 }

      

    抓住青春的尾巴。。。
  • 相关阅读:
    Fizz Buzz 问题
    旋转字符串
    合并排序数组
    尾部的零
    A + B 问题
    CentOS6.x安装RabbitMQ
    MySql游标
    MySql存储过程
    找出n个自然数(1,2,3,……,n)中取r个数的组合
    正则表达式
  • 原文地址:https://www.cnblogs.com/xidian-mao/p/10468552.html
Copyright © 2011-2022 走看看