HDU 3683 模拟&搜索
给出五子棋残局,推断三步内能否分出胜负,玩家为当前该走旗子的颜色,下一步为白棋或黑棋不定。
依照顺序推断就可以:
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 模拟&搜索的更多相关文章
- Splinter学习--初探1,模拟百度搜索
Splinter是以Selenium, PhantomJS 和 zope.testbrowser为基础构建的web自动化测试工具,基本原理同selenium 支持的浏览器包括:Chrome, Fire ...
- hdu 4634 Swipe Bo 搜索
典型的bfs模拟 (广度优先搜索) ,不过有好多细节要注意,比如图中如果是 R# 走到这个R的话就无限往右走了,这样就挂了~肯定到不了出口.还有一种容易造成死循环的,比如 #E## DLLL D. ...
- 强化学习(十八) 基于模拟的搜索与蒙特卡罗树搜索(MCTS)
在强化学习(十七) 基于模型的强化学习与Dyna算法框架中,我们讨论基于模型的强化学习方法的基本思路,以及集合基于模型与不基于模型的强化学习框架Dyna.本文我们讨论另一种非常流行的集合基于模型与不基 ...
- python 使用selenium模块实现自动搜索百度百科词条(模拟人工搜索)
目标:模拟人工搜索百度百科词条,爬取相关信息,自动删除上一个关键词,输入新关键词,继续搜索,直到循环结束. 代码: from selenium import webdriver from seleni ...
- python--selenium简单模拟百度搜索点击器
python--selenium简单模拟百度搜索点击器 发布时间:2018-02-28 来源:网络 上传者:用户 关键字: selenium 模拟 简单 点击 搜索 百度 发表文章摘要:用途:简单模拟 ...
- JavaScript-dom3 json_str dom元素控制 模拟百度搜索
访问关系-封装代码 html <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...
- JS---DOM---案例:模拟百度搜索框
模拟百度搜索框 我的思路整理: 1. 注册文本框抬起事件(onkeyup) 2. 处理函数: --->创建临时数组,循环遍历文本框键入的文字内容和keywords数组,用keyWords[i]. ...
- java 模拟简单搜索
Java 模拟简单搜索 实体类 package org.dennisit.entity; /** * * * @version : 1.0 * * @author : 苏若年 <a href=& ...
- hdu 3683 Gomoku (模拟、搜索)
Gomoku Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
随机推荐
- 【Bootstrap】自己主动去适应PC、平面、手机Bootstrap网格系统
酒吧格英语作为一门系统"grid systems",也有人翻译成"网络格系统".使用固定格子设计布局,其风格整齐而简洁,在二战结束后人气,流风格之中的一个. 1 ...
- linux 下修改 apache 启动的所属用户和组
apache默认启动的用户和组是www-data,所以有些时候,就会涉及到权限问题,没有权限在执行目录下创建或者读写文件.改变用户和组的方法其实很简单: 1.进入到apache默认安装路径/etc/a ...
- winform正在使用dsoframer迅速"Unable to display the inactive document.Click here to reacitive the document."
于winform正在使用dsoframer 1.3加载word档,但在axFramerControl1.Open("NPOI.docx");于axFramerControl1控制显 ...
- Java-如何去掉JFrame上的最大化最小化和关闭按钮(转)
在JDK1.4以前,我们只有一种方式来去掉窗口的标题栏,那就是直接使用JWindow,用JWindow来代替JFrame使用.但用过JWindow的人一定知道,JWindow在操作系统的任务栏是不可见 ...
- Android与server通信中的方法(TCP)高效的安全完整
我以前一直使用sockets实现emulator和PC进行通讯,卡了几天,最后请教其它人最终能够连接了. 错误原因是在IP和port,IP要用本机IP(在CMD输入ipconfig.注意:每次开机本 ...
- WPF学习(1)WPF概述
WPF(Windows Presentation Foundation)是微软推出的基于Windows Vista的用户界面框架,属于NET Framework 3.0的一部分.它提供了统一的编程模型 ...
- 中国的手写输入法iOS8.1在崩溃
当中国的手写输入法.会导致app收起.于debug时刻.报错: 2014-10-22 14:45:10.269 App[524:170755] -[UIKBBlurredKeyView candida ...
- SQL开发中容易忽视的一些小地方(五)
原文:SQL开发中容易忽视的一些小地方(五) 背景: 索引分类:众所周知,索引分为聚集索引和非聚集索引. 索引优点:加速数据查询. 问题:然而我们真的清楚索引的应用吗?你写的查询语句是否能充分应用上索 ...
- IE浏览器兼容性问题解决方法
如何用一行代码来解决CSS各种IE各种兼容性问题 一行代码来解决CSS在,IE6,IE7,IE8,IE9,IE10 各种兼容性问题. 在站点前端写代码的过程中,非常多时间IE各个版本号的兼容问题非常难 ...
- java验证手机号码是否合法
公司开发新功能须要验证手机号码,遂自己写了个出来,暂仅仅支持中国大陆手机号验证.如有不妥之处,还望大家指教,感激不尽! /** * 验证是否是正确合法的手机号码 * * @param telephon ...