思路:用极大极小搜索解决这样的问题很方便!!

代码如下:

 #include <cstdio>
#include <algorithm>
#define inf 100000000
using namespace std;
char str[][];
int x,y,num;
bool ok(int x,int y) //判断是否胜
{
int i;
for(i=;i<;i++) //(x,y)所在的行
if(str[x][i]!=str[x][y]) break;
if(i==) return ;
for(i=;i<;i++) //(x,y)所在的列
if(str[i][y]!=str[x][y]) break;
if(i==) return ;
if(x==y){ //主对角线
for(i=;i<;i++)
if(str[i][i]!=str[x][y]) break;
if(i==) return ;
return ;
}
if(x+y==){ //副对角线
for(i=;i<;i++)
if(str[i][-i]!=str[x][y]) break;
if(i==) return ;
return ;
}
return ;
}
int minimax(int x,int y,int ma);
int maxmini(int x,int y,int mi)
{
int ma=-inf;
if(ok(x,y)) return ma;
if(num==) return ;
for(int i=;i<;i++)
for(int j=;j<;j++)
if(str[i][j]=='.'){
str[i][j]='x';
num++;
int t=minimax(i,j,ma);
num--;
str[i][j]='.';
ma=max(ma,t);
if(ma>=mi) return ma;
}
return ma;
}
int minimax(int x,int y,int ma)
{
int mi=inf;
if(ok(x,y)) return mi;
if(num==) return ;
for(int i=;i<;i++)
for(int j=;j<;j++)
if(str[i][j]=='.'){
str[i][j]='o';
num++;
int t=maxmini(i,j,mi);
num--;
str[i][j]='.';
mi=min(mi,t);
if(mi<=ma) return mi;
}
return mi;
}
bool cal()
{
int ma=-inf;
for(int i = ;i<;i++)
for(int j = ;j<;j++)
if(str[i][j]=='.'){
str[i][j]='x';
num++;
int t = minimax(i,j,ma);
num--;
str[i][j]='.';
ma=max(t,ma);
if(ma==inf){
x=i;
y=j;
return ;
}
}
return ;
}
int main()
{
char ch[];
// freopen("1.txt","r",stdin);
while(scanf("%s",ch)&&ch[]!='$'){
num = ;
for(int i = ;i < ;i++){
scanf("%s",str[i]);
for(int j = ;j < ;j++)
num += (str[i][j]!='.');
}
if(num <= ){
printf("#####\n");
continue;
}
if(cal()) printf("(%d,%d)\n",x,y);
else printf("#####\n");
}
}

poj 1568 Find the Winning Move 极大极小搜索的更多相关文章

  1. POJ 1568 Find the Winning Move

    Find the Winning Move 链接 题意: 4*4的棋盘,给出一个初始局面,问先手有没有必胜策略? 有的话输出第一步下在哪里,如果有多个,按(0, 0), (0, 1), (0, 2), ...

  2. poj1568 Find the Winning Move[极大极小搜索+alpha-beta剪枝]

    Find the Winning Move Time Limit: 3000MS   Memory Limit: 32768K Total Submissions: 1286   Accepted:  ...

  3. POJ 1568 Find the Winning Move(极大极小搜索)

    题目链接:http://poj.org/problem?id=1568 题意:给出一个4*4的棋盘,x和o两人轮流放.先放够连续四个的赢.给定一个局面,下一个轮到x放.问x是否有必胜策略?若有,输出能 ...

  4. POJ 1568 极大极小搜索 + alpha-beta剪枝

    极小极大搜索 的个人理解(alpha-beta剪枝) 主要算法依据就是根据极大极小搜索实现的. 苦逼的是,查了两个晚上的错,原来最终是判断函数写错了..瞬间吐血! ps. 据说加一句 if sum & ...

  5. 【迭代博弈+搜索+剪枝】poj-1568--Find the Winning Move

    poj  1568:Find the Winning Move   [迭代博弈+搜索+剪枝] 题面省略... Input The input contains one or more test cas ...

  6. 算法笔记--极大极小搜索及alpha-beta剪枝

    参考1:https://www.zhihu.com/question/27221568 参考2:https://blog.csdn.net/hzk_cpp/article/details/792757 ...

  7. 【poj1568】 Find the Winning Move

    http://poj.org/problem?id=1568 (题目链接) 题意 两人下4*4的井字棋,给出一个残局,问是否有先手必胜策略. Solution 极大极小搜索.. 这里有个强力优化,若已 ...

  8. 极大极小搜索思想+(α/β)减枝 【转自-----https://blog.csdn.net/hzk_cpp/article/details/79275772】

    极大极小搜索,即minimax搜索算法,专门用来做博弈论的问题的暴力. 多被称为对抗搜索算法. 这个搜索算法的基本思想就是分两层,一层是先手,记为a,还有一层是后手,记为b. 这个搜索是认为这a与b的 ...

  9. [CodeVs3196]黄金宝藏(DP/极大极小搜索)

    题目大意:给出n(≤500)个数,两个人轮流取数,每次可以从数列左边或者右边取一个数,直到所有的数被取完,两个人都以最优策略取数,求最后两人所得分数. 显然这种类型的博弈题,第一眼就是极大极小搜索+记 ...

随机推荐

  1. QTP获取系统时间并自定义格式

    function GetDateTime(Nowstr)          Dim Currentdatetime           Dim YY   'Year          Dim MM   ...

  2. MVVMLight leaning note

    Learning Note For MvvmLight MvvmLight quitstart refer link1 : MVVMLight HelloWorld *** mc:Ignorable ...

  3. C#设计模式之装饰者模式(Decorator Pattern)

    1.概述 装饰者模式,英文名叫做Decorator Pattern.装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 2 ...

  4. HTML/CSS的学习过程一览

    HTML/CSS的学习过程一览 说明 调试工具使用的是Google Chrome浏览器,其余浏览器出现的问题,这锅我不背[傲娇脸 可以使用浏览器查看源代码 网页列表 HTML_CSS_1 HTML基本 ...

  5. Android Jni变量对照表

    字符 Java类型 C类型 V      void            void Z       jboolean     boolean I        jint              in ...

  6. QWidget设置为模态问题

    设置QWidget的Qt::WindowModality属性为Qt::WindowModal和Qt::ApplicationModal,发现窗体仍然不会模态,网上查了一下,有人说改属性只对window ...

  7. Mysql中将查询出来的多列的值用逗号拼接

    select group_concat(字段名) from 表名

  8. android Service Activity交互之传递复杂数据类型的远程服务

    远程服务往往不只是传递java基本数据类型.这时需要注意android的一些限制和规定: android支持String和CharSequence 如果需要在aidl中使用其他aidl接口类型,需要i ...

  9. iptables端口转发

    iptables -t nat -A PREROUTING -d {外网ip}/32 -p tcp -m tcp --dport 4956 -j DNAT --to-destination 10.1. ...

  10. Upgrading to Java 8——第四章 The Stream API

    在这章中我们将学习Stream API,在JDK 8 中的一项新的特性.为了理解这一章的主题,你需要知道如何使用Lambda表达式和java.util.function里的预定义的函数式接口. 一个S ...