棋局评估

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector> 
#include<string>
#include<stack>
#include<map>
using namespace std;
int a[5][5],h;
struct Pos
{
    int x,y;
}pos[20]; 
int value(int x,int y,int type)        //评价此时局面 
{
        int start = a[x][y];
        a[x][y] = type;
        int temp;
        if(type == 1)    temp = 2;
        else            temp = 1; 
        
        
        //直接胜利 
        if(a[1][1] == type && a[2][2] == type && a[3][3] == type)    return    100000;            
        if(a[1][3] == type && a[2][2] == type && a[3][1] == type)    return    100000;    
        for(int i=1;i<=3;i++)
        {
            if(a[i][1] == type && a[i][2] == type && a[i][3] == type)    return    100000;        
            if(a[1][i] == type && a[2][i] == type && a[3][i] == type)    return    100000;
        }
        
        
        int sum = 0; 
        
        //对方有2连枝, //        一开始没注意,2连枝,每一直线有3种情况 
        if(a[1][1] == temp && a[2][2] == temp && a[3][3] == 0)        sum += -100000;            
        if(a[3][3] == temp && a[2][2] == temp && a[1][1] == 0)        sum += -100000;            
        if(a[1][1] == temp && a[3][3] == temp && a[2][2] == 0)        sum += -100000;            
        if(a[3][3] == temp && a[2][2] == temp && a[1][1] == 0)        sum += -100000;    
        if(a[1][3] == temp && a[2][2] == temp && a[3][1] == 0)        sum += -100000;    
        if(a[3][1] == temp && a[1][3] == temp && a[2][2] == 0)        sum += -100000;                
        for(int i=1;i<=3;i++)
        {
            if(a[i][1] == temp && a[i][2] == temp && a[i][3] == 0)     sum += -100000;        
            if(a[i][2] == temp && a[i][3] == temp && a[i][1] == 0)    sum += -100000;    
            if(a[i][1] == temp && a[i][3] == temp && a[i][2] == 0)    sum += -100000;    
            if(a[1][i] == temp && a[2][i] == temp && a[3][i] == 0)    sum += -100000;    
            if(a[2][i] == temp && a[3][i] == temp && a[1][i] == 0)    sum += -100000;        //i 和 数字 写反了 
            if(a[1][i] == temp && a[3][i] == temp && a[2][i] == 0)    sum += -100000;        
        }
        
        //对方有单连枝 
        if(a[1][1] == temp && a[2][2] == 0 && a[3][3] == 0)        sum += -10;            
        if(a[2][2] == temp && a[3][3] == 0 && a[1][1] == 0)        sum += -10;        
        if(a[3][3] == temp && a[2][2] == 0 && a[1][1] == 0)        sum += -10;        
        if(a[1][3] == temp && a[2][2] == 0 && a[3][1] == 0)        sum += -10;    
        if(a[3][1] == temp && a[2][2] == 0 && a[1][3] == 0)        sum += -10;    
        if(a[2][2] == temp && a[3][1] == 0 && a[1][3] == 0)        sum += -10;    
        
        for(int i=1;i<=3;i++)
        {
            if(a[i][1] == temp && a[i][2] == 0 && a[i][3] == 0)     sum += -10;        
            if(a[i][2] == temp && a[i][3] == 0 && a[i][1] == 0)        sum += -10;    
            if(a[i][3] == temp && a[i][2] == 0 && a[i][1] == 0)        sum += -10;    
            if(a[1][i] == temp && a[2][i] == 0 && a[3][i] == 0)        sum += -10;    
            if(a[2][i] == temp && a[3][i] == 0 && a[1][i] == 0)        sum += -10;    
            if(a[3][i] == temp && a[2][i] == 0 && a[1][i] == 0)        sum += -10;
        }
        
        
        //每有一个2连枝且有机会组成3连枝 加100分 
        if(a[1][1] == type && a[2][2] == type && a[3][3] == 0)        sum += 100;            
        if(a[3][3] == type && a[2][2] == type && a[1][1] == 0)        sum += 100;        
        if(a[3][3] == type && a[1][1] == type && a[2][2] == 0)        sum += 100;        
        if(a[1][3] == type && a[2][2] == type && a[3][1] == 0)        sum += 100;    
        if(a[3][1] == type && a[2][2] == type && a[1][3] == 0)        sum += 100;    
        if(a[3][1] == type && a[1][3] == type && a[2][2] == 0)        sum += 100;                        
        for(int i=1;i<=3;i++)
        {
            if(a[i][1] == type && a[i][2] == type && a[i][3] == 0)     sum += 100;        
            if(a[i][2] == type && a[i][3] == type && a[i][1] == 0)    sum += 100;    
            if(a[i][1] == type && a[i][3] == type && a[i][2] == 0)    sum += 100;    
            if(a[1][i] == type && a[2][i] == type && a[3][i] == 0)    sum += 100;    
            if(a[2][i] == type && a[3][i] == type && a[1][i] == 0)    sum += 100;    
            if(a[1][i] == type && a[3][i] == type && a[2][i] == 0)    sum += 100;
        }
        
        //每有一个单连枝且有机会组成3连枝 加10分 
        if(a[1][1] == type && a[2][2] == 0 && a[3][3] == 0)        sum += 10;            
        if(a[2][2] == type && a[3][3] == 0 && a[1][1] == 0)        sum += 10;        
        if(a[3][3] == type && a[2][2] == 0 && a[1][1] == 0)        sum += 10;        
        if(a[1][3] == type && a[2][2] == 0 && a[3][1] == 0)        sum += 10;    
        if(a[3][1] == type && a[2][2] == 0 && a[1][3] == 0)        sum += 10;    
        if(a[2][2] == type && a[3][1] == 0 && a[1][3] == 0)        sum += 10;    
        
        for(int i=1;i<=3;i++)
        {
            if(a[i][1] == type && a[i][2] == 0 && a[i][3] == 0)     sum += 10;        
            if(a[i][2] == type && a[i][3] == 0 && a[i][1] == 0)        sum += 10;    
            if(a[i][3] == type && a[i][2] == 0 && a[i][1] == 0)        sum += 10;    
            if(a[1][i] == type && a[2][i] == 0 && a[3][i] == 0)        sum += 10;    
            if(a[2][i] == type && a[3][i] == 0 && a[1][i] == 0)        sum += 10;    
            if(a[3][i] == type && a[2][i] == 0 && a[1][i] == 0)        sum += 10;
        }
        //printf("%d %d %d\n",x,y,sum);
        a[x][y] = start;

        return sum;
}

int select(int ct)        
{
    while(1)
    {
    
        if(ct == 0 )    break;
        if(ct % 2 == 1)
        {
            int max = -100,posi,num; 
            for(int i=0;i<h;i++)
            {
                if(pos[i].x != 0 && pos[i].y != 0 )
                {
                    num = value(pos[i].x,pos[i].y,1);
                    if(max < num)
                    {
                        max = num;
                        posi = i;
                    }
                }
                
            }
            if(max == 100000)    return ct;
            
            a[pos[posi].x][pos[posi].y] = 1;
            pos[posi].x = 0;
            pos[posi].y = 0;
        }
        else
        {
            int max = -100,posi,num; 
            for(int i=0;i<h;i++)
            {
                if(pos[i].x != 0 && pos[i].y != 0 )
                {
                    num = value(pos[i].x,pos[i].y,2);
                    if(max < num)
                    {
                        max = num;
                        posi = i;
                    }
                }
                
            }
            if(max == 100000)    return -ct;
            a[pos[posi].x][pos[posi].y] = 2;
            pos[posi].x = 0;
            pos[posi].y = 0;
        }
        ct--;
    }
     
    return 0;
}    
int main()
{
    int t;
    scanf("%d",&t);
    for(int x=0;x<t;x++)
    {
        int sum = 0; 
        h = 0;
        for(int i=1;i<=3;i++)
        {
            for(int j=1;j<=3;j++)
            {
                scanf("%d",&a[i][j]);
                if(a[i][j] == 0)    
                {
                    sum++;
                    pos[h].x = i;
                    pos[h].y = j;
                    h++;
                }
            }
        }
        if(value(0,0,1) == 100000)                printf("%d\n",sum+1);
        else if(value(0,0,2) == 100000)            printf("%d\n",-(sum+1));
        else                                    printf("%d\n",select(sum));
        
    }
    return 0;
}

 

posted @ 2019-03-05 16:22  萌新上路  阅读(165)  评论(0编辑  收藏  举报