• poj 1568 Find the Winning Move 极大极小搜索


    思路:用极大极小搜索解决这样的问题很方便!!

    代码如下:

      1 #include <cstdio>
      2 #include <algorithm>
      3 #define inf 100000000
      4 using namespace std;
      5 char str[4][5];
      6 int x,y,num;
      7 bool ok(int x,int y) //判断是否胜
      8 {
      9     int i;
     10     for(i=0;i<4;i++)  //(x,y)所在的行
     11         if(str[x][i]!=str[x][y]) break;
     12     if(i==4) return 1;
     13     for(i=0;i<4;i++) //(x,y)所在的列
     14         if(str[i][y]!=str[x][y]) break;
     15     if(i==4) return 1;
     16     if(x==y){ //主对角线
     17         for(i=0;i<4;i++)
     18             if(str[i][i]!=str[x][y]) break;
     19         if(i==4) return 1;
     20         return 0;
     21     }
     22     if(x+y==3){ //副对角线
     23         for(i=0;i<4;i++)
     24             if(str[i][3-i]!=str[x][y]) break;
     25         if(i==4) return 1;
     26         return 0;
     27     }
     28     return 0;
     29 }
     30 int minimax(int x,int y,int ma);
     31 int maxmini(int x,int y,int mi)
     32 {
     33     int ma=-inf;
     34     if(ok(x,y)) return ma;
     35     if(num==16) return 0;
     36     for(int i=0;i<4;i++)
     37         for(int j=0;j<4;j++)
     38             if(str[i][j]=='.'){
     39                 str[i][j]='x';
     40                 num++;
     41                 int t=minimax(i,j,ma);
     42                 num--;
     43                 str[i][j]='.';
     44                 ma=max(ma,t);
     45                 if(ma>=mi) return ma;
     46             }
     47     return ma;
     48 }
     49 int minimax(int x,int y,int ma)
     50 {
     51     int mi=inf;
     52     if(ok(x,y)) return mi;
     53     if(num==16) return 0;
     54     for(int i=0;i<4;i++)
     55         for(int j=0;j<4;j++)
     56             if(str[i][j]=='.'){
     57                 str[i][j]='o';
     58                 num++;
     59                 int t=maxmini(i,j,mi);
     60                 num--;
     61                 str[i][j]='.';
     62                 mi=min(mi,t);
     63                 if(mi<=ma) return mi;
     64             }
     65     return mi;
     66 }
     67 bool cal()
     68 {
     69     int ma=-inf;
     70     for(int i = 0;i<4;i++)
     71         for(int j = 0;j<4;j++)
     72             if(str[i][j]=='.'){
     73                 str[i][j]='x';
     74                 num++;
     75                 int t = minimax(i,j,ma);
     76                 num--;
     77                 str[i][j]='.';
     78                 ma=max(t,ma);
     79                 if(ma==inf){
     80                     x=i;
     81                     y=j;
     82                     return 1;
     83                 }
     84             }
     85     return 0;
     86 }
     87 int main()
     88 {
     89     char ch[4];
     90 //    freopen("1.txt","r",stdin);
     91     while(scanf("%s",ch)&&ch[0]!='$'){
     92         num = 0;
     93         for(int i = 0;i < 4;i++){
     94             scanf("%s",str[i]);
     95             for(int j = 0;j < 4;j++)
     96                 num += (str[i][j]!='.');
     97         }
     98         if(num <= 4){
     99             printf("#####
    ");
    100             continue;
    101         }
    102         if(cal()) printf("(%d,%d)
    ",x,y);
    103         else printf("#####
    ");
    104     }
    105 }
    View Code
  • 相关阅读:
    算法面试准备(一)之----交叉熵与logistic回归推导
    Julia初学备忘
    二维数组中的查找,替换空格
    快慢指针倒数第K个节点,每K个一组反转链表
    贝叶斯网络之----(d-分离步骤)
    一笑
    尾曲
    ggplot在python中的使用(plotnine)
    SVC之SMO算法理解
    特征选取之IV(信息值)及python实现
  • 原文地址:https://www.cnblogs.com/xin-hua/p/3330310.html
Copyright © 2020-2023  润新知