给出五子棋残局,推断三步内能否分出胜负,玩家为当前该走旗子的颜色,下一步为白棋或黑棋不定。

依照顺序推断就可以:

1:推断棋盘是否合法,并确定玩家颜色

2:推断当前玩家颜色是否有一个必胜点,有玩家则在第一步胜

3:推断还有一方在当前是否有两个必胜点,若有,则玩家在第二步失败

4:BFS出玩家是否存在此方案:随意放置一个位置的前提下,还有一方没有必胜点,且玩家有两个必胜点,则玩家在第三步胜

5:否则3步内无法分出胜负

#include "stdio.h"
#include "string.h" int dir[4][2]={{-1,0},{-1,1},{0,1},{1,1}}; int map[21][21];
int ans_x,ans_y; int ok1(int key)
{
int i,j,x,y,k,sum;
for (i=0;i<15;i++)
for (j=0;j<15;j++)
if (map[i][j]==-1)
{
for (k=0;k<4;k++)
{
x=i; y=j; sum=1;
while (1)
{
x+=dir[k][0];
y+=dir[k][1];
if (x<0 || x>=15 || y<0 || y>=15) break;
if (map[x][y]!=key) break;
sum++;
}
x=i;y=j;
while (1)
{
x-=dir[k][0];
y-=dir[k][1];
if (x<0 || x>=15 || y<0 || y>=15) break;
if (map[x][y]!=key) break;
sum++; }
if (sum>=5) { ans_x=i; ans_y=j; return 1;}
}
}
return -1;
} int ok2(int key)
{
int i,j,k,x,y,sum,ok;
ok=0;
for (i=0;i<=14;i++)
for (j=0;j<=14;j++)
if (map[i][j]==-1)
{
for (k=0;k<4;k++)
{
sum=1;
x=i; y=j;
while (1)
{
x+=dir[k][0];
y+=dir[k][1];
if (x<0 || x>=15 || y<0 || y>=15) break;
if (map[x][y]!=key) break;
sum++;
}
x=i; y=j;
while (1)
{
x-=dir[k][0];
y-=dir[k][1];
if (x<0 || x>=15 || y<0 || y>=15) break;
if (map[x][y]!=key) break;
sum++;
}
if (sum>=5) {ok++;break;}
}
if (ok==2) return 1;
}
return -1;
} int bfs(int key)
{
int i,j;
for (i=0;i<15;i++)
for (j=0;j<15;j++)
if (map[i][j]==-1)
{
map[i][j]=key;
if (ok1(1-key)==-1 && ok2(key)==1)
{
ans_x=i; ans_y=j;
return 1;
}
map[i][j]=-1;
}
return -1;
} int main()
{
int n,i,a,b,c,blk,wt,first,ans;
while (scanf("%d",&n)!=EOF)
{
if (n==0) break; blk=wt=0;
memset(map,-1,sizeof(map));
for (i=1;i<=n;i++)
{
scanf("%d%d%d",&a,&b,&c);
map[a][b]=c;
if (c==1) blk++; else wt++;
} if (blk==wt) first=1;
else
if (blk==wt+1) first=0;
else
{
printf("Invalid.\n");
continue;
} ans=ok1(first); // 第一步存在必胜点
if (ans==1)
{
printf("Place ");
if (first==1) printf("black "); else printf("white ");
printf("at (%d,%d) to win in 1 move.\n",ans_x,ans_y);
continue;
} ans=ok2(1-first); // 还有一方存在两个必胜点
if (ans==1)
{
printf("Lose in 2 moves.\n");
continue;
} ans=bfs(first); // 搜索是否存在第三步定胜负 if (ans==1)
{
printf("Place ");
if (first==1) printf("black "); else printf("white ");
printf("at (%d,%d) to win in 3 moves.\n",ans_x,ans_y);
continue;
}
else
printf("Cannot win in 3 moves.\n"); }
return 0; }

HDU 3683 模拟&amp;搜索的更多相关文章

  1. Splinter学习--初探1,模拟百度搜索

    Splinter是以Selenium, PhantomJS 和 zope.testbrowser为基础构建的web自动化测试工具,基本原理同selenium 支持的浏览器包括:Chrome, Fire ...

  2. hdu 4634 Swipe Bo 搜索

    典型的bfs模拟 (广度优先搜索) ,不过有好多细节要注意,比如图中如果是  R#  走到这个R的话就无限往右走了,这样就挂了~肯定到不了出口.还有一种容易造成死循环的,比如 #E## DLLL D. ...

  3. 强化学习(十八) 基于模拟的搜索与蒙特卡罗树搜索(MCTS)

    在强化学习(十七) 基于模型的强化学习与Dyna算法框架中,我们讨论基于模型的强化学习方法的基本思路,以及集合基于模型与不基于模型的强化学习框架Dyna.本文我们讨论另一种非常流行的集合基于模型与不基 ...

  4. python 使用selenium模块实现自动搜索百度百科词条(模拟人工搜索)

    目标:模拟人工搜索百度百科词条,爬取相关信息,自动删除上一个关键词,输入新关键词,继续搜索,直到循环结束. 代码: from selenium import webdriver from seleni ...

  5. python--selenium简单模拟百度搜索点击器

    python--selenium简单模拟百度搜索点击器 发布时间:2018-02-28 来源:网络 上传者:用户 关键字: selenium 模拟 简单 点击 搜索 百度 发表文章摘要:用途:简单模拟 ...

  6. JavaScript-dom3 json_str dom元素控制 模拟百度搜索

    访问关系-封装代码 html <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...

  7. JS---DOM---案例:模拟百度搜索框

    模拟百度搜索框 我的思路整理: 1. 注册文本框抬起事件(onkeyup) 2. 处理函数: --->创建临时数组,循环遍历文本框键入的文字内容和keywords数组,用keyWords[i]. ...

  8. java 模拟简单搜索

    Java 模拟简单搜索 实体类 package org.dennisit.entity; /** * * * @version : 1.0 * * @author : 苏若年 <a href=& ...

  9. hdu 3683 Gomoku (模拟、搜索)

    Gomoku Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

随机推荐

  1. Oracle FGA审计记录的清理步骤

    注意:本文为原创文章,转载请注明出处: http://blog.csdn.net/msdnchina/article/details/38435999 一.确认有哪些fga审计策略, 从select ...

  2. ArcMap合并之路 -- 该段路合并成一个完整的路

    #1: 用 Arctoolbox\Data Management Tools\Generalization\dissolve 工具 #2: Options:dissolve field 项选" ...

  3. PKU A Simple Problem with Integers (段树更新间隔总和)

    意甲冠军:一个典型的段树C,Q问题,有n的数量a[i] (1~n),C, a, b,c在[a,b]加c Q a b 求[a,b]的和. #include<cstdio> #include& ...

  4. 初步swift语言学习笔记6(ARC-自己主动引用计数,内存管理)

    笔者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/31824179 转载请注明出处 假设认为文章对你有所帮助.请通过留言 ...

  5. jquery ui tab跳转

    1.tabs_iframe.jsp <%-- Document : tabs Created on : 2015-2-28, 14:44:02 Author : liyulin lyl01099 ...

  6. SAP ABAP第一,两,三代出口型BADI实现 解释的概念

    BADI这是第三代用户出口型.让我们来看看如何实现的细节. 一个,用户出口的类型 1,第一代 sap提供了一个空的子程序代码.在这个过程分,用户可以添加自己的代码.为了控制自己的需求.这样的改进是需要 ...

  7. Android Studio简单设置(转)

    Android Studio 简单设置 界面设置 默认的 Android Studio 为灰色界面,可以选择使用炫酷的黑色界面.Settings --> Appearance --> Th ...

  8. Google调试技巧总结

    工欲善其事 工欲善其事,必先利器. Google调试面板一一介绍:F12回想一下大家都应该知道,哈哈 element面板 这个面板显示了页面所有html代码.用于调试css代码.右側展示左側相应选择元 ...

  9. ImageView建立selector在录音中遇到的小问题及解决方案

    随着两张照片做了一个selector,采用ImageView的src要么background采用selector当点击,总不会出现点击效果,这就是为什么?经过一番折腾,后来发现"揭秘&quo ...

  10. hdu4419 Colourful Rectangle 12年杭州网络赛 扫描线+线段树

    题意:给定n个矩形,每个矩形有一种颜色,RGB中的一种.相交的部分可能为RG,RB,GB,RGB,问这n个矩形覆盖的面积中,7种颜色的面积分别为多少 思路:把x轴离散化做扫描线,线段树维护一个扫描区间 ...