五子棋AI大赛
来源:互联网 发布:如何求最大公约数 算法 编辑:程序博客网 时间:2024/05/01 11:04
A. 五子棋AI格式 2014新生暑假个人排位赛10
时间限制 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的整数。
输入样例
000000000000000000000000000000000000000000000000000000000000000000000000000000000011210000000000011120000000000022221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
输出样例
8 7
欢脱的比赛。选择合理的估分策略,利用进制,保证优先级不变。将四个方向的分数加起来,方便比较。
代码:#include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<cstring>#include<queue>#include<stack>#include<set>#include<map>using namespace std;char board[20][20];//存棋盘int dx[10]={0,0,-1,1,-1,1,-1,1},dy[10]={1,-1,0,0,-1,1,1,-1};//上,下,左,右,左上,右下,左下,右上struct node{ int px,py,rprice;}p[5];int price(int j,int yes){ if(j>=5) return 1000000; if(j==4&&yes==2) return 100000; if(j==3&&yes==2) return 15000; if(j==4&&yes==1) return 10000; if(j==3&&yes==1) return 1000; if(j==2&&yes==2) return 100; if(j==2&&yes==1) return 10; if(yes==1) return 1; else return 0;}char my_color;//己方棋子的颜色void judge(char color,int x,int y){ int pr=0; for(int i=0;i<8;i+=2) { int yes,yes1=0,yes2=0,j=1,nx=x+dx[i],ny=y+dy[i]; while(nx>=1&&nx<=15&&ny>=1&&ny<=15&&color==board[nx][ny]) { j++; nx+=dx[i]; ny+=dy[i]; } while(yes1<=4&&nx>=1&&nx<=15&&ny>=1&&ny<=15&&board[nx][ny]=='0') { yes1++; } nx=x+dx[i+1];ny=y+dy[i+1]; while(nx>=1&&nx<=15&&ny>=1&&ny<=15&&color==board[nx][ny]) { j++; nx+=dx[i+1]; ny+=dy[i+1]; } while(yes2<=4&&nx>=1&&nx<=15&&ny>=1&&ny<=15&&board[nx][ny]=='0') { yes2++; } if(j>=5) yes=0; else if(j==4) { if(yes1&&yes2) yes=2; else if(yes1||yes2) yes=1; else yes=0; } else if(j==3) { if(yes1&&yes2&&yes1+yes2>=3) yes=2; else if(yes1+yes2==2) yes=1; else yes=0; } else if(j==2) { if(yes1&&yes2&&yes1+yes2>=4) yes=2; else if(yes1+yes2==3) yes=1; else yes=0; } pr+=price(j,yes); } if(pr>p[color-'0'].rprice) { p[color-'0'].rprice=pr; p[color-'0'].px=x; p[color-'0'].py=y; }}int main(){ int i,j,cnt[3]={0},maxx=0,maxy=0,minx=20,miny=20; p[1].rprice=-1; p[2].rprice=-1; for(i=1;i<=15;i++) { scanf("%s",board[i]+1); for(j=1;j<=15;j++) { if(board[i][j]!='0') { cnt[board[i][j]-'0']++; maxx=max(maxx,i); minx=min(minx,i); maxy=max(maxy,j); miny=min(miny,j); } } } if(cnt[1]==cnt[2]) my_color='1'; else my_color='2'; if(cnt[1]==0) printf("8 8\n"); else if(cnt[2]==0) { if(board[8][8]=='0') printf("8 8\n"); else printf("8 7\n"); } else { for(i=minx-3;i<=maxx+3;i++) { for(j=miny-3;j<=maxy+3;j++) { if(i>=1&&i<=15&&j>=1&&j<=15&&board[i][j]=='0') { judge('1',i,j); judge('2',i,j); } } } if(p[my_color-'0'].rprice>=1000000) printf("%d %d\n",p[my_color-'0'].px,p[my_color-'0'].py); else if(p[3-my_color+'0'].rprice>=1000000) printf("%d %d\n",p[3-my_color+'0'].px,p[3-my_color+'0'].py); else if(p[my_color-'0'].rprice>=100000) printf("%d %d\n",p[my_color-'0'].px,p[my_color-'0'].py); else if(p[3-my_color+'0'].rprice>=100000) printf("%d %d\n",p[3-my_color+'0'].px,p[3-my_color+'0'].py); else if(p[my_color-'0'].rprice>=20000) printf("%d %d\n",p[my_color-'0'].px,p[my_color-'0'].py); else if(p[3-my_color+'0'].rprice>=20000) printf("%d %d\n",p[3-my_color+'0'].px,p[3-my_color+'0'].py); else if(p[my_color-'0'].rprice>=10000) printf("%d %d\n",p[my_color-'0'].px,p[my_color-'0'].py); else if(p[3-my_color+'0'].rprice>=10000) printf("%d %d\n",p[3-my_color+'0'].px,p[3-my_color+'0'].py); else if(p[my_color-'0'].rprice>=p[3+'0'-my_color].rprice) printf("%d %d\n",p[my_color-'0'].px,p[my_color-'0'].py); else printf("%d %d\n",p[3-my_color+'0'].px,p[3-my_color+'0'].py); } return 0;}
A. 五子棋AI格式 2014新生暑假个人排位赛10
时间限制 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的整数。
输入样例
000000000000000000000000000000000000000000000000000000000000000000000000000000000011210000000000011120000000000022221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
输出样例
8 7
欢脱的比赛。选择合理的估分策略,利用进制,保证优先级不变。将四个方向的分数加起来,方便比较。
代码:#include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<cstring>#include<queue>#include<stack>#include<set>#include<map>using namespace std;char board[20][20];//存棋盘int dx[10]={0,0,-1,1,-1,1,-1,1},dy[10]={1,-1,0,0,-1,1,1,-1};//上,下,左,右,左上,右下,左下,右上struct node{ int px,py,rprice;}p[5];int price(int j,int yes){ if(j>=5) return 1000000; if(j==4&&yes==2) return 100000; if(j==3&&yes==2) return 15000; if(j==4&&yes==1) return 10000; if(j==3&&yes==1) return 1000; if(j==2&&yes==2) return 100; if(j==2&&yes==1) return 10; if(yes==1) return 1; else return 0;}char my_color;//己方棋子的颜色void judge(char color,int x,int y){ int pr=0; for(int i=0;i<8;i+=2) { int yes,yes1=0,yes2=0,j=1,nx=x+dx[i],ny=y+dy[i]; while(nx>=1&&nx<=15&&ny>=1&&ny<=15&&color==board[nx][ny]) { j++; nx+=dx[i]; ny+=dy[i]; } while(yes1<=4&&nx>=1&&nx<=15&&ny>=1&&ny<=15&&board[nx][ny]=='0') { yes1++; } nx=x+dx[i+1];ny=y+dy[i+1]; while(nx>=1&&nx<=15&&ny>=1&&ny<=15&&color==board[nx][ny]) { j++; nx+=dx[i+1]; ny+=dy[i+1]; } while(yes2<=4&&nx>=1&&nx<=15&&ny>=1&&ny<=15&&board[nx][ny]=='0') { yes2++; } if(j>=5) yes=0; else if(j==4) { if(yes1&&yes2) yes=2; else if(yes1||yes2) yes=1; else yes=0; } else if(j==3) { if(yes1&&yes2&&yes1+yes2>=3) yes=2; else if(yes1+yes2==2) yes=1; else yes=0; } else if(j==2) { if(yes1&&yes2&&yes1+yes2>=4) yes=2; else if(yes1+yes2==3) yes=1; else yes=0; } pr+=price(j,yes); } if(pr>p[color-'0'].rprice) { p[color-'0'].rprice=pr; p[color-'0'].px=x; p[color-'0'].py=y; }}int main(){ int i,j,cnt[3]={0},maxx=0,maxy=0,minx=20,miny=20; p[1].rprice=-1; p[2].rprice=-1; for(i=1;i<=15;i++) { scanf("%s",board[i]+1); for(j=1;j<=15;j++) { if(board[i][j]!='0') { cnt[board[i][j]-'0']++; maxx=max(maxx,i); minx=min(minx,i); maxy=max(maxy,j); miny=min(miny,j); } } } if(cnt[1]==cnt[2]) my_color='1'; else my_color='2'; if(cnt[1]==0) printf("8 8\n"); else if(cnt[2]==0) { if(board[8][8]=='0') printf("8 8\n"); else printf("8 7\n"); } else { for(i=minx-3;i<=maxx+3;i++) { for(j=miny-3;j<=maxy+3;j++) { if(i>=1&&i<=15&&j>=1&&j<=15&&board[i][j]=='0') { judge('1',i,j); judge('2',i,j); } } } if(p[my_color-'0'].rprice>=1000000) printf("%d %d\n",p[my_color-'0'].px,p[my_color-'0'].py); else if(p[3-my_color+'0'].rprice>=1000000) printf("%d %d\n",p[3-my_color+'0'].px,p[3-my_color+'0'].py); else if(p[my_color-'0'].rprice>=100000) printf("%d %d\n",p[my_color-'0'].px,p[my_color-'0'].py); else if(p[3-my_color+'0'].rprice>=100000) printf("%d %d\n",p[3-my_color+'0'].px,p[3-my_color+'0'].py); else if(p[my_color-'0'].rprice>=20000) printf("%d %d\n",p[my_color-'0'].px,p[my_color-'0'].py); else if(p[3-my_color+'0'].rprice>=20000) printf("%d %d\n",p[3-my_color+'0'].px,p[3-my_color+'0'].py); else if(p[my_color-'0'].rprice>=10000) printf("%d %d\n",p[my_color-'0'].px,p[my_color-'0'].py); else if(p[3-my_color+'0'].rprice>=10000) printf("%d %d\n",p[3-my_color+'0'].px,p[3-my_color+'0'].py); else if(p[my_color-'0'].rprice>=p[3+'0'-my_color].rprice) printf("%d %d\n",p[my_color-'0'].px,p[my_color-'0'].py); else printf("%d %d\n",p[3-my_color+'0'].px,p[3-my_color+'0'].py); } return 0;}
0 0
- 五子棋AI大赛
- 五子棋AI
- AI----------五子棋
- AI五子棋
- 五子棋AI
- 【五子棋AI】一、AI概述
- 【五子棋AI】一、AI概述 .
- 五子棋AI算法
- 五子棋AI版
- 五子棋AI思路
- 五子棋AI设计
- 五子棋AI设计
- 五子棋AI算法浅谈
- Java版AI五子棋
- 五子棋AI设计
- 五子棋AI设计-简介
- 简单五子棋AI
- 五子棋的简单AI
- bin目录下hadoop脚本使用
- linux中poll用法
- KD-tree学习笔记
- 同网段地址判断
- ubuntu 12.04设置源
- 五子棋AI大赛
- hdu 1018 斯特灵公式
- Android体系结构
- 手机短号(2081)
- 运行*.run文件
- Eclipse两种部署web项目方法
- C / C++ / Linux / —— 学习笔记
- VMware 虚拟机与物理机 的网络连接
- [水]ZOJ1295