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

题面省略。。。

Input

The input contains one or more test cases, followed by a line beginning with a dollar sign that signals the end of the file. Each test case begins with a line containing a question mark and is followed by four lines representing the board; formatting is exactly as shown in the example. The characters used in a board description are the period (representing an empty space), lowercase x, and lowercase o. For each test case, output a line containing the (row, column) position of the first forced win for x, or '#####' if there is no forced win. Format the output exactly as shown in the example.

Output

For this problem, the first forced win is determined by board position, not the number of moves required for victory. Search for a forced win by examining positions (0, 0), (0, 1), (0, 2), (0, 3), (1, 0), (1, 1), ..., (3, 2), (3, 3), in that order, and output the first forced win you find. In the second test case below, note that x could win immediately by playing at (0, 3) or (2, 0), but playing at (0, 1) will still ensure victory (although it unnecessarily delays it), and position (0, 1) comes first.

Sample Input

?
....
.xo.
.ox.
....
?
o...
.ox.
.xxx
xooo

....
....
....
.... (再加一组特殊样例)
$

Sample Output

#####
(0,1)
#####

大致题意::

    给定一个四乘四的棋盘,面对一个残局;问先手再下一步是否可以达成最终的胜利;若可以则输出按顺序的坐标最小的那个。

解决思路:

    (我给起的名字是博弈搜索算法,其实是极大极小搜索算法!)

    博弈迭代思想+搜索+剪枝。
    思路解释起来很麻烦,简单说就是:枚举先手一步,针对新加的新手一步--然后判断是否后手无论怎么下就注定是死局......

注意:

   1、在迭代的过程中,平局也是后手胜,因为题目仅要求先手是否面对的是必赢局!
         2、我的博客专栏胡搞里也有相关的可以瞅瞅!http://www.cnblogs.com/zhazhaacmer/category/1137385.html

带注释的题解(第二种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的更多相关文章

  1. POJ 1568 Find the Winning Move

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

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

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

  3. poj 1568 Find the Winning Move 极大极小搜索

    思路:用极大极小搜索解决这样的问题很方便!! 代码如下: #include <cstdio> #include <algorithm> #define inf 10000000 ...

  4. 搜索+剪枝——POJ 1011 Sticks

    搜索+剪枝--POJ 1011 Sticks 博客分类: 算法 非常经典的搜索题目,第一次做还是暑假集训的时候,前天又把它翻了出来 本来是想找点手感的,不想在原先思路的基础上,竟把它做出来了而且还是0 ...

  5. UVA 529 - Addition Chains,迭代加深搜索+剪枝

    Description An addition chain for n is an integer sequence  with the following four properties: a0 = ...

  6. [Vijos1308]埃及分数(迭代加深搜索 + 剪枝)

    传送门 迭代加深搜索是必须的,先枚举加数个数 然后搜索分母 这里有一个强大的剪枝,就是确定分母的范围 #include <cstdio> #include <cstring> ...

  7. 搜索 + 剪枝 --- POJ 1101 : Sticks

    Sticks Problem's Link:   http://poj.org/problem?id=1011 Mean: http://poj.org/problem?id=1011&lan ...

  8. 搜索+剪枝 POJ 1416 Shredding Company

    POJ 1416 Shredding Company Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5231   Accep ...

  9. 迭代加深搜索 POJ 1129 Channel Allocation

    POJ 1129 Channel Allocation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 14191   Acc ...

随机推荐

  1. 【VS开发】IP地址格式转换(htonl、ntohl;inet_addr、inet_ntoa)

    1.htonl ()和ntohl( ) u_long PASCAL FAR ntohl (u_long netlong); u_short PASCAL FAR ntohs (u_short nets ...

  2. C语言中malloc、free和new、delete的用法和区别

    很多学过C的人对malloc都不是很了解,知道使用malloc要加头文件,知道malloc是分配一块连续的内存,知道和free函数是一起用的.但是但是: 一部分人还是将:malloc当作系统所提供的或 ...

  3. Vmware player--打开vmdk; 导出系统;

    https://www.cnblogs.com/wxdblog/p/7091496.html 用vmware player打开已经存在的VMDK的方法: https://jingyan.baidu.c ...

  4. python 之 数据库(内置函数、流程控制、索引)

    10.17 内置函数 强调:mysql内置的函数只能在sql语句中使用 #数学函数 round(x,y) #返回参数x的四舍五入的有y位小数的值 rand() #返回0到1内的随机值,可以通过提供一个 ...

  5. 细说浏览器输入URL后发生了什么

    本文摘要: 1.DNS域名解析: 2.建立TCP连接: 3.发送HTTP请求: 4.服务器处理请求: 5.返回响应结果: 6.关闭TCP连接: 7.浏览器解析HTML: 8.浏览器布局渲染: 总结   ...

  6. 无法解析的外部符号 ___argc nafxcw.lib(appcore.obj)

    参考 https://blog.csdn.net/wfree/article/details/44171157 MFC的使用: 由"在静态库中使用 MFC" 改成 "在共 ...

  7. C#操作Windows控制面板

    先介绍一下Windows控制面板的一些操作,再介绍如何用C#语言来操作控制面板. 1.如何快速打开控制面板中的项目: 运行输入(大小写不敏感) control system 打开系统信息 contro ...

  8. springboot_4 spring boot 使用servlet,filter,listener和interceptor

    上一篇我们学习了 spring boot 利用Controller响应数据与响应页面. 一般的Web开发使用 Controller 基本上可以完成大部分需求,但是有的时候我们还是会用到 Servlet ...

  9. Bootstrap4 入门

    http://www.runoob.com/bootstrap4/bootstrap4-navs.html 共五个部分 1 <!DOCTYPE html> <html lang=&q ...

  10. 免root xshell连接termux

    免root实现xshell连接termux termux为安卓手机上的一款模拟linux终端的应用,由于手机上打字比较麻烦,所以想到了用电脑上的xshell通过ssh连接termux,以实现电脑控制t ...