【迭代博弈+搜索+剪枝】poj-1568--Find the Winning Move
poj 1568:Find the Winning Move 【迭代博弈+搜索+剪枝】
题面省略。。。
Input
Output
Sample Input
?
....
.xo.
.ox.
....
?
o...
.ox.
.xxx
xooo
?
....
....
....
.... (再加一组特殊样例)
$
Sample Output
#####
(0,1)
#####
大致题意::
解决思路:
(我给起的名字是博弈搜索算法,其实是极大极小搜索算法!)
注意:
带注释的题解(第二种check()为超时的判断局面的函数):
char mp[][];
int check(int x,int y,char mp[][]){ //判定新更改的点(x,y)是否会构成胜利的局面,两斜/横/竖
if(x==y&&mp[][]!='.'&&mp[][]==mp[][]&&mp[][]==mp[][]&&mp[][]==mp[][])
return (mp[][]=='x'?:);
if(x+y==&&mp[][]!='.'&&mp[][]==mp[][]&&mp[][]==mp[][]&&mp[][]==mp[][])
return (mp[][]=='x'?:);
if(mp[x][]!='.'&&mp[x][]==mp[x][]&&mp[x][]==mp[x][]&&mp[x][]==mp[x][])
return (mp[x][]=='x'?:);
if(mp[][y]!='.'&&mp[][y]==mp[][y]&&mp[][y]==mp[][y]&&mp[][y]==mp[][y])
return (mp[][y]=='x'?:);
}
/* !!下面这种判断是否可以达到结束的局面的方法,时间复杂度高,毕竟把整个图跑了两遍!
int check1(char mp[4][5]){ //三种返回值,0表示前者,1表示后者,-1表示平局
for(int i=0;i<=3;i++){
if(mp[i][0]!='.'&&mp[i][0]==mp[i][1]&&mp[i][1]==mp[i][2]&&mp[i][2]==mp[i][3])
return (mp[i][0]=='x'?0:1);
}
for(int i=0;i<=3;i++){
if(mp[0][i]!='.'&&mp[0][i]==mp[1][i]&&mp[1][i]==mp[2][i]&&mp[2][i]==mp[3][i])
return (mp[0][i]=='x'?0:1);
}
if(mp[0][0]!='.'&&mp[0][0]==mp[1][1]&&mp[1][1]==mp[2][2]&&mp[2][2]==mp[3][3])
return (mp[0][0]=='x'?0:1);
if(mp[0][3]!='.'&&mp[0][3]==mp[1][2]&&mp[1][2]==mp[2][1]&&mp[2][1]==mp[3][0])
return (mp[0][3]=='x'?0:1); for(int i=0;i<=3;i++){
for(int j=0;j<=3;j++){
if(mp[i][j]=='.')
return -1;
}
}
return 1;//假设整个棋盘全部布满,平局就也是后者赢!
}
*/
int check_whole(){ // //判断全局都是点'.',若是则一定是平局,此种特例不特判必定超时
for(int i=;i<=;i++){
for(int j=;j<=;j++)
if(mp[i][j]!='.')
return false;
}
return true;
}
int ansx,ansy;//记录第一次下的点的x和y坐标,也就是step=0的时候! bool dfs(int x,int y,int op,int step){//对于op来说,先手X: 0要求必赢,后手1要求不败即可!
char ch = (op==)?'x':'o'; int val=check(x,y,mp);
if(val==op)
return true;
else if(val==!op)
return false; for(int i=;i<=;i++){
for(int j=;j<=;j++){
if(mp[i][j]=='.'){
mp[i][j]=ch;
if(dfs(i,j,!op,step+)==false){
mp[i][j]='.';
// printf("****step=%d****%d,%d ch=%c\n",step,i,j,(op==0)?'x':'o');
if(step==){
ansx=i;ansy=j;
}
return true;
}
mp[i][j]='.';
}
}
} return false;
} int main(){
char ch[];
while(scanf("%s",ch),ch[]!='$'){
for(int i=;i<=;i++)
scanf("%s",mp[i]);
if(check_whole()==true)//特判一次!全图都为点时,不忽略的话注定超时!
printf("#####\n");
else if(dfs(,,,)==true)
printf("(%d,%d)\n",ansx,ansy);
else
printf("#####\n");
} return ;
}
(头文件都回家过五一喽了!QWQ)
【迭代博弈+搜索+剪枝】poj-1568--Find the Winning Move的更多相关文章
- POJ 1568 Find the Winning Move
Find the Winning Move 链接 题意: 4*4的棋盘,给出一个初始局面,问先手有没有必胜策略? 有的话输出第一步下在哪里,如果有多个,按(0, 0), (0, 1), (0, 2), ...
- POJ 1568 Find the Winning Move(极大极小搜索)
题目链接:http://poj.org/problem?id=1568 题意:给出一个4*4的棋盘,x和o两人轮流放.先放够连续四个的赢.给定一个局面,下一个轮到x放.问x是否有必胜策略?若有,输出能 ...
- poj 1568 Find the Winning Move 极大极小搜索
思路:用极大极小搜索解决这样的问题很方便!! 代码如下: #include <cstdio> #include <algorithm> #define inf 10000000 ...
- 搜索+剪枝——POJ 1011 Sticks
搜索+剪枝--POJ 1011 Sticks 博客分类: 算法 非常经典的搜索题目,第一次做还是暑假集训的时候,前天又把它翻了出来 本来是想找点手感的,不想在原先思路的基础上,竟把它做出来了而且还是0 ...
- UVA 529 - Addition Chains,迭代加深搜索+剪枝
Description An addition chain for n is an integer sequence with the following four properties: a0 = ...
- [Vijos1308]埃及分数(迭代加深搜索 + 剪枝)
传送门 迭代加深搜索是必须的,先枚举加数个数 然后搜索分母 这里有一个强大的剪枝,就是确定分母的范围 #include <cstdio> #include <cstring> ...
- 搜索 + 剪枝 --- POJ 1101 : Sticks
Sticks Problem's Link: http://poj.org/problem?id=1011 Mean: http://poj.org/problem?id=1011&lan ...
- 搜索+剪枝 POJ 1416 Shredding Company
POJ 1416 Shredding Company Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5231 Accep ...
- 迭代加深搜索 POJ 1129 Channel Allocation
POJ 1129 Channel Allocation Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 14191 Acc ...
随机推荐
- Python离线环境
一.应用场景 比如:对于数据安全要求比较严格的机房,服务器是不允许上网的.那么我现在开发了一套python程序,需要一些模块,怎么运行? 二.离线包制作 有2个解决方案: 1. 使用requireme ...
- CentOS 6和CentOS 7的系统服务管理
也许你配置过Windows开机启动的服务,其中有些服务在日常的管理工作中用不到,我们就要把它停止,一来可以节省资源,而来可以减少安全隐患.在Linux上同样也有相关的工具来管理系统的服务. chkco ...
- 【计算机视觉】SeetaFace Engine开源C++人脸识别引擎
SeetaFace Engine是一个开源的C++人脸识别引擎,它可以在不依赖第三方的条件下载CPU上运行.他包含三个关键部分,即:SeetaFace Detection,SeetaFace Alig ...
- 教你使用Webpack搭建环境 TypeScript (2)
一. 环境搭建1.1. TypeScript环境安装已经配置好的环境,大家可以直接下载:https://github.com/coderwhy/HYLearnTS.git在上一个章节中我们说过,T ...
- 常见的序列化框架及Protobuf序列化原理
原文链接:https://www.jianshu.com/p/657fbf347934 https://www.cnblogs.com/javazhiyin/p/11375553.html https ...
- LeetCode 897. 递增顺序查找树(Increasing Order Search Tree)
897. 递增顺序查找树 897. Increasing Order Search Tree 题目描述 给定一个树,按中序遍历重新排列树,使树中最左边的结点现在是树的根,并且每个结点没有左子结点,只有 ...
- pytorch1.0实现RNN for Regression
import torch from torch import nn import numpy as np import matplotlib.pyplot as plt # 超参数 # Hyper P ...
- 解决VS2017中使用scanf函数报错的问题
我们在VS2017中如果使用C语言的scanf输入函数,编译的时候编译器会报error C4996: 'scanf': This function or variable may be unsafe. ...
- Qt4 和 Qt5 模块的分类
Qt5 与 Qt4 其中的一个区别是底层架构进行了改变,Qt5 引入了更加详细的模块化的概念,将众多功能细分到几个模块之中,Qt4 则是一种粗略的划分.本文主要对 Qt5 和 Qt4的模块进行一个简单 ...
- 解决阿里云OSS The requested bucket name is not available的办法
今天在创建Bucket的时候遇到了这个问题 The requested bucket name is not available. The bucket namespace is shared by ...