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

依照顺序推断就可以:

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. 伪异步IO理解

    伪异步IO实在堵塞IO的基础上将每个client发送过来的请求由新创建的线程来处理改进为用线程池来处理.因此避免了为每个client请求创建一个新线程造成的资源耗尽问题. 来看一下伪异步IO的服务端代 ...

  2. C奇淫技巧,——宏神奇

    一个.宏列表 当这个问题面临: 有一个标志变量.位代表对应的含义. 我们须要提供一组函数来訪问设置这些位.可是对于每一个标记位的操作函数都是相似的.若有32个位,难道要搞32套相似的操作函数么? 你或 ...

  3. (hdu step 6.3.7)Cat vs. Dog(当施工方规则:建边当观众和其他观众最喜爱的东西冲突,求最大独立集)

    称号: Cat vs. Dog Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...

  4. Sonar——代码质量管理平台

    Sonar——代码质量管理平台 一.基本认识 Sonar (SonarQube)是一个开源平台,用于管理源代码的质量. Sonar 不只是一个质量数据报告工具,更是代码质量管理平台.通过插件机制,So ...

  5. Teams(uva11609+组合)

    I - Teams Time Limit:1000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit cid=7795 ...

  6. NIVC-&gt;IPR[IPADDR]

    #include <stm32f10x.h>   #include "sys.h" //表偏移地址 //NVIC_VectTab:基址 //Offset:偏移量 //C ...

  7. 记2014“蓝桥杯全国软件大赛&quot;决赛北京之行

    5月29,30日 最终到了这一天.晚上有数据结构课,10点多的火车,我们就没有去上课,下午在宿舍里收拾东西,晚上8点左右从南校出发,9点半多到达火车站和老师学长学姐们会和. 第一次去北京,第一次买的卧 ...

  8. iOS 8中CLLocationManager及MKMapView showUserLocation失败的解决的方法

    用XCode 6编译的原来XCode 5.1.1写的程序时,发现原来写的CLLocationManager定位的代码以及MKmapView的showUserLocation失效.查了一下,XCode ...

  9. asp.net学习之ado.net(连接模式访问)

    原文:asp.net学习之ado.net(连接模式访问)    ado.net框架支持两种模式的数据访问: 连接模式(Connected)和非连接模式(disconnected).这一节介绍如何使用连 ...

  10. ubuntu 14.04 hadoop eclipse 0配置基本环境

    动人的hadoop第二天.构造hadoop该环境还花了两天时间,在这里写自己配置的过程,我希望能帮助! 我将文中用到的全部资源都分享到了  这里,点开就能下载,不须要一个个的找啦! 当中有<Ha ...