暑期个人赛--第十场--A

时间限制 1000 ms  内存限制 65536 KB

题目描述

设计五子棋AI是一个很简单但是也很考验编程设计功底的事,今天的排位赛就让大家来设计一个五子棋AI。

相信现场的每个人都玩过五子棋,没有玩过的可以现在去玩:http://www.4399.com/special/159.htm

不同的人玩五子棋可能有不同规则,我们统一这一次的比赛规则如下。

1. 棋盘大小为15×15。
2. 白方和黑方轮流下子,棋子不可以下到其他棋子上,黑方先走,对战双方锤子剪刀布决定谁为黑方。
3. 无禁手规则。

4. 谁先让自己的棋子连成五颗或者五颗以上获胜,没有平局,若棋盘下满了还没有获胜则更换先后手再下一盘,程序异常直接判输。

5. 比赛赛制:

    淘汰赛制度,第一轮按照ID和姓名的排序分为8个小组,小组内进行循环赛,每个小组决出两名胜者。

    每一个小组内与其他2-3名选手都要打一盘,积分较高的2名选手进第二轮,同组出现同分的进入晋级池,直到只剩下16个选手。

    第二三轮依然为小组赛,规则同上,每一轮人数减半,最后一轮决出[冠军1个][亚军1个][季军2个]排位赛记分为7,6,5。其余的选手根据轮数分别记为4,3,2,通过oj上的题目的数据,记分分别为1。

 

输入格式

我们的AI测试系统是这样的,给你一个15*15的放了棋子的棋盘,可以看成一个包含012三种字符的矩阵
1表示黑子,2表示白子,0表示没有棋子。
请你设计一个AI程序,输出下一个棋子下哪,如果局面的黑白子相等,你走黑棋,否则走白棋子。
本题目的棋局都是下一步就必赢的棋局,你的AI如果能赢就能得AC。

单组数据。

输出格式

输出两个数字,你所下的棋子的位置。横纵坐标均为1-15的整数。

输入样例

000000000000000
000000000000000
000000000000000
000000000000000
000000000000000
000000011210000
000000011120000
000000022221000
000000000000000
000000000000000
000000000000000
000000000000000
000000000000000
000000000000000
000000000000000

输出样例

8 7


赛中提交:AC


下面是AC代码:

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string>
#include <vector>
#include <list>
#include <map>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <numeric>
#include <functional>
#include <time.h>
#define maxn 500005
 
using namespace std;
char g[16][16];
//bool vis[16][16];
int value1[16][16],value2[16][16],value3[16][16];
int r[2]={0,14};
int c[2]={0,14};
int ansi=16,ansj=16,maxv=0;
 
void check(int flag,int value[][16],int &numlag,int i,int j)
{
    if(numlag&&g[i][j]!=flag){
        if(g[i][j]=='0'){
            value[i][j]+=10*(numlag-1);
            if(numlag==1){
                value[i][j]+=1;
            }
            if(value[i][j]>maxv){
                maxv=value[i][j];
                ansi=i;
                ansj=j;
            }
        }
        numlag=0;
    }
    else if(g[i][j]==flag){
        numlag+=1;
    }
}
 
void solve(char flag)
{
    memset(value1,0,sizeof(value1));
    for(int i=0;i<15;i+=1){
        int n=0;
        for(int j=0;j<15;j+=1){
            check(flag,value1,n,i,j);
        }
        n=0;
        for(int j=14;j>=0;j-=1){
            check(flag,value1,n,i,j);
        }
    }
 
    memset(value1,0,sizeof(value1));
    for(int i=0;i<15;i+=1){
        int n=0;
        for(int j=0;j<15;j+=1){
            check(flag,value1,n,j,i);
        }
        n=0;
        for(int j=14;j>=0;j-=1){
            check(flag,value1,n,j,i);
        }
    }
/******************************************/
    memset(value1,0,sizeof(value1));
    memset(value2,0,sizeof(value2));
    for(int i=0;i<15;i+=1){
        int n1=0,n2=0,n3=0,n4=0;
        for(int k=0;1;k+=1){
            bool used=false;
            int j=0;
            if(i+k<15&&j+k<15&&i+k>-1&&j+k>-1){
                check(flag,value1,n1,i+k,j+k);
                used=true;
            }
            /****/
            if(i+k<15&&j+k<15&&i+k>-1&&j+k>-1){
                check(flag,value1,n2,j+k,i+k);
                used=true;
            }
            /***/
            if(i-k<15&&j+k<15&&i-k>-1&&j+k>-1){
                check(flag,value2,n3,j+k,i-k);
                used=true;
            }
            /***/
            if(i-k<15&&j+k<15&&i-k>-1&&j+k>-1){
                check(flag,value2,n4,i-k,j+k);
                used=true;
            }
 
            if(!used) break;
        }
    }
 
    for(int i=14;i>=0;i-=1){
        int n1=0,n2=0,n3=0,n4=0;
        for(int k=0;1;k+=1){
            int j=14;
            bool used=false;
            if(i-k<15&&j-k<15&&i-k>-1&&j-k>-1){
                check(flag,value1,n1,j-k,i-k);
                used=true;
            }
            /**/
            if(i-k<15&&j-k<15&&i-k>-1&&j-k>-1){
                check(flag,value1,n2,i-k,j-k);
                used=true;
            }
            /**/
            if(i-k<15&&j+k<15&&i-k>-1&&j+k>-1){
                check(flag,value2,n3,i-k,j+k);
                used=true;
            }
            /****/
            if(i-k<15&&j+k<15&&i-k>-1&&j+k>-1){
                check(flag,value2,n4,j+k,i-k);
                used=true;
            }
 
            if(!used) break;
        }
    }
}
 
int main()
{
    int black=0,white=0;
    char flag=0;
    for(int i=0;i<15;i+=1){
        for(int j=0;j<15;j+=1){
            scanf("%c",&g[i][j]);
            if(g[i][j]=='1'){
               black+=1;
            }
            else if(g[i][j]=='2'){
                white+=1;
            }
        }
        getchar();
    }
 
    int antiflag;
    if(black==white){
        flag='1'; //走黑棋
        antiflag='2';
    }
    else{
        flag='2';  //走白旗
        antiflag='1';
    }
    solve(flag);
    solve(antiflag);
 
    int i=0;
    while(g[ansi][ansj]!='0'||ansi>14||ansi<0||ansj>14||ansj<0){
        srand(time(NULL)+i);
        int z1=rand(),z2=rand();
        ansi=z1/2%16,ansj=z2/2%16;
        //printf("%d %d--%c\n",ansi+1,ansj+1,g[ansi+1][ansj+1]);
        //system("pause");
        i+=1;
    }
    printf("%d %d\n",ansi+1,ansj+1);
    return 0;
}




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值