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 ...
随机推荐
- Android Studio如何引用jar包裹(不gradle)
这和eclipse最大的区别.与非常人的预期开始Android Studio我们很不高兴这一套. 它直接在地图上.首先通过File->Projcet structure打开project结构界面 ...
- JAVA学习 分析Servlet
一个.什么是Servlet Servlet是一种在server端执行的java编写的程序,是依照Servlet规范编写的一个java类. 二.Servlet的工作过程 如图所看到的:为了实现客户与se ...
- CSDN Androidclient生产 导航帖
弄个导航棒.的相关知识汇总. CSDN Android的client的效果图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbG1qNjIzNTY1Nzk ...
- LeetCode——Pascal's Triangle
Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5, Retu ...
- 采用curl库
Windows通过使用curl库: 到http://curl.haxx.se/下了个curl的源代码下来,源代码是用VC6编译的,我在VS2005下又一次进行编译.竟然仅仅有一个警告. cUrl的实现 ...
- GoldenGate组态(四)它veridata组态
GoldenGate组态(四)它veridata组态 环境: Item Source System Target System Platform Red Hat Enterprise Linux Se ...
- ehcache历史变迁及常用API的使用(转)
ehcache是一个用Java实现的使用简单,高速,实现线程安全的缓存管理类库,ehcache提供了用内存,磁盘文件存储,以及分布式存储方式等多种灵活的cache管理方案.同时ehcache作为开放源 ...
- ecshop广告调用方法
在简单地概括ecshop广告调用该方法,已发表在博客上,在这里,我们总结了以下 :就是官方默认的方法.先加入广告位,然后加入模板的广告位区域,再在将两者相应上. 1.后台 > 广告管理 > ...
- ipad pro注定是失败的!
ipad pro注定是失败的! 把一个玩具操作系统装在生产力工具上就能产生生产力了? so young so simple!
- cocos2d 简单的日常高仿酷跑游戏
1.第一个直接看看这个游戏看起来视频(GIF我们不能满足游戏展) 跑酷游戏最纠结的是地图.碰撞倒是简单,能够自己写或者使用box2d等物理引擎.跑酷游戏地图的特点就是随机性.可是随机中又有策划特意安排 ...