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 ...
随机推荐
- hud 1312 Red and Black
题目: 链接:pid=1312">点击打开链接 题意: DFS搜索 算法: dfs 思路: 简单题 代码: #include<iostream> #include<c ...
- 不一样的是不一样的,我的独家滚动条------Day35
在您开始建立自己的,感觉应该先录一个概念:内核的浏览器. 兼容性问题之前多次提及,而在平时经常会遇到兼容性问题.原因,就在于它:浏览器内核.这是比較通俗的说法,事实上应该把它描写叙述的专业点:Rend ...
- 简单工厂模式—>工厂模式
一.功能 根据前一篇博客:策略模式+单例模式+简单工厂模式:推送服务,想试用一下工厂模式:将之前的简单工厂模式格式化为工厂模式. 二.实现 修改前:简单工厂 public static class P ...
- 数据同步DataX
数据同步那些事儿(优化过程分享) 简介 很久之前就想写这篇文章了,主要是介绍一下我做数据同步的过程中遇到的一些有意思的内容,和提升效率的过程. 当前在数据处理的过程中,数据同步如同血液一般充满全过 ...
- Task的异步模式
Task的异步模式 返回该系列目录<基于Task的异步模式--全面介绍> 生成方法 编译器生成 在.NET Framework 4.5中,C#编译器实现了TAP.任何标有async关键字的 ...
- Xenomai 3 和 PREEMPT_RT 有哪些优势相比,
Q: 我可以在我的开发板PREEMPT_RT直接在内核环境中执行POSIX应用, 使用Xenomai3 这是什么原因它? A:假设你的应用程序已经完全是POSIX,而且性能也满足,则,而且也没有理由去 ...
- Sql示例说明如何分组后求中间值--【叶子】
原文:Sql示例说明如何分组后求中间值--[叶子] 这里所谓的分组后求中间值是个什么概念呢? 我举个例子来说明一下: 假设我们现在有下面这样一个表: type name price -- ...
- python中and和or的使用方法
今天看了一个源代码,甚是对python不解,于是查了下资料,只是纠正下网上的老兄的解释 python 中的and从右到左计算表达式.若全部值均为真,则返回最后一个值.若存在假,返回第一个假值. or是 ...
- bootstrap之Click大事
上一篇文章中谈到了bootstrap流程,本文开始把目光bootstrap它可以接受指令(从源代码视图的透视.因为appium该项目现在还处于不断更新,因此,一些指令已经实现.也许未来会实现一些.从视 ...
- 浅析Java中的final关键字(转)
谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下 ...