HDU 3683 Gomoku
HDU_3683
这个题目由于情况不多,所以可以直接枚举,只不过枚举的时候需要注意一些细节。
枚举顺序如下:
①判断我们1步是否能赢。
②判断我们2步是否会输。实际上如果第2步会输,那么就相当于在当前棋盘状态下,对方至少有2个地方可以在落子后连5。
③判断我们3步是否会赢。在这里需要讨论一下,如果轮到③就说明我们在②的时候得到了两种情况,对方有1个地方可以在落子后连5,或者没有这样的地方。如果有1个地方可以落子连5,那么这一步我们必须走这个位置,如果没有这样的位置,我们这步就可以随意落子。枚举我们的落子位置之后再判断一下对方2步是否会输即可(相当于又进行了一次②,只不过这时的对象由我们变成了对方)。
#include<stdio.h>#include<string.h>int a[20][20],nx,ny;char b[][10]={"white","black"};int judge(now){int i,j;for(i=0;i<15;i++)for(j=0;j<15;j++) {if(i<11&&j<11)if(a[i][j]==now&&a[i+1][j+1]==now&&a[i+2][j+2]==now&&a[i+3][j+3]==now&&a[i+4][j+4]==now)return 1;if(i<11)if(a[i][j]==now&&a[i+1][j]==now&&a[i+2][j]==now&&a[i+3][j]==now&&a[i+4][j]==now)return 1;if(j<11)if(a[i][j]==now&&a[i][j+1]==now&&a[i][j+2]==now&&a[i][j+3]==now&&a[i][j+4]==now)return 1;if(i>3&&j<11)if(a[i][j]==now&&a[i-1][j+1]==now&&a[i-2][j+2]==now&&a[i-3][j+3]==now&&a[i-4][j+4]==now)return 1; }return 0;}int judge1(int now){int i,j,num=0,ok;for(i=0;i<15;i++)for(j=0;j<15;j++)if(a[i][j]<0) { a[i][j]=now; ok=judge(now); a[i][j]=-1;if(ok) { nx=i; ny=j;return 1; } }return 0;}int judge2(int now){int i,j,num=0,ok;for(i=0;i<15;i++)for(j=0;j<15;j++)if(a[i][j]<0) { a[i][j]=!now; ok=judge(!now); a[i][j]=-1;if(ok) { num++; nx=i; ny=j;if(num==2)return num; } }return num;}int judge3(int now){int i,j,ok;if(judge2(now)==1) { i=nx; j=ny; a[i][j]=now;if(judge2(!now)==2) { nx=i; ny=j;return 1; }elsereturn 0; }for(i=0;i<15;i++)for(j=0;j<15;j++)if(a[i][j]<0) { a[i][j]=now; ok=judge2(!now); a[i][j]=-1;if(ok==2) { nx=i; ny=j;return 1; } } return 0;}int main(){int i,j,k,n,x,y,now;while(1) { scanf("%d",&n);if(n==0)break; memset(a,-1,sizeof(a)); now=1;for(i=0;i<n;i++) { scanf("%d%d%d",&x,&y,&k);if(k) now--;else now++; a[x][y]=k; }if(now!=0&&now!=1) { printf("Invalid.\n");continue; }if(n<=5) { printf("Cannot win in 3 moves.\n");continue; }if(judge1(now)) printf("Place %s at (%d,%d) to win in 1 move.\n",b[now],nx,ny);else if(judge2(now)==2) printf("Lose in 2 moves.\n");else if(judge3(now)) printf("Place %s at (%d,%d) to win in 3 moves.\n",b[now],nx,ny);else printf("Cannot win in 3 moves.\n"); }return 0; }
HDU 3683 Gomoku相关推荐
- [2-sat专练]poj 3683,hdu 1814,hdu 1824,hdu 3622,hdu 4115,hdu 4421
文章目录 Priest John's Busiest Day code Peaceful Commission code Let's go home code Bomb Game code Elimi ...
- 【转载】图论 500题——主要为hdu/poj/zoj
转自--http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...
- HDU——1106排序(istringstream的使用、STLvector练习)
排序 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submiss ...
- hdu 5438 Ponds 拓扑排序
Ponds Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/contests/contest_showproblem ...
- HDU 1248 寒冰王座(全然背包:入门题)
HDU 1248 寒冰王座(全然背包:入门题) http://acm.hdu.edu.cn/showproblem.php?pid=1248 题意: 不死族的巫妖王发工资拉,死亡骑士拿到一张N元的钞票 ...
- hdu 1312 Red and Black 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1312 第二条深搜,题目并不难,但是做了我好久好久,由于一个细节,让我赌上了一个晚上的时间. 题目大意: ...
- HDU 1429 胜利大逃亡(续) (BFS+位压缩)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) ...
- hdu 1272 小希的迷宫
Problem Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该 ...
- HDOJ 1157 HDU 1157 Who's in the Middle ACM 1157 IN HDU
MiYu原创, 转帖请注明 : 转载自 ______________白白の屋 题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1157 题目描述: ...
最新文章
- 车辆行人检测数据集_开源 | 相机和激光雷达融合的行人车辆检测跟踪
- 深入python3 (Dive Into Python 3) 在线阅读与下载
- python画出心形图-python画出心形图
- JUST技术:空间连接运算与空间索引
- 2M线路保护实现与应用
- centos7 cuda测试_CentOS 7 安装 NVIDIA 显卡驱动以及CUDA驱动(自测可用)
- vue 路由懒加载,组件异步加载
- 图像的平滑与锐化代码matlab_【图像处理】轻松搞懂图像锐化
- 素拓活动策划书的撰写范文
- Linux Shell编程笔记8 进程
- php ip重复注册,php中表单的重复提交怎么通过记录IP来防止
- postfix+web页面+身份验证
- Nuget如何管理本地的包
- mysql5.6二进制包_MySQL 5.6版本二进制包多实例安装
- 英文java简历模板下载_java英文简历模板
- 微信订餐商城,微店系统.互联网第二个春天!
- 《仿人机器人原理与实战》一1.2 反射弧与仿人机器人设计
- SpringBoot 整合 Editormd(完整版)
- 定时任务:数据表设计与实现方案
- JSP空间上当受骗篇