描述

如下图所示,在4x4的棋盘上有X和Y两种棋子各若干枚;O表示空格。

OXXY

YOOX

XOOY

XOXX

小Hi每次可以选择任意一枚棋子,将它移动到上下左右相邻的空格中。

小Hi想知道最少移动多少次可以达到胜利局面:有4个X或者4个Y连成一行、一列或者对角线(两条对角线都算胜利)。

输入

4x4的棋盘

输出

达成胜利最少需要的步数。如果小Hi无论如何也达不到胜利局面,输出-1。

样例输入

OXXY
YOOX
XOOY
XOXX

样例输出

思路:

数据小,达到目标的最小步骤问题,多半是搜索。但是X,Y两个形态,那么状态压缩的话,假设0是O,1是X,2是Y,则有3^16=43046721,无法二进制处理,直接用map记录string。

数组记录关系,好简短啊。。。

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<queue>
using namespace std;
map<string,int>mp;
queue<string>q;
int head,tail;
int a[][]={ {}, {,,,}, {,,,},{}, {} };
int b[][]={ {}, {,,}, {,,}, {,,}, {,,} };
int c[][]={ {}, {,,,},{,,,},{,,,},{,,,} };
int d[]={,,-,,-};
using namespace std;
bool check(string s)
{
for(int i=;i<=;i++)//1是列,2是行 ,a代表起始,b代表跨度。
for(int j=;j<;j++)//每行或者每列共4个
if(s[a[i][j]]!='O'&&s[a[i][j]]==s[a[i][j]+b[i][]]&&s[a[i][j]]==s[a[i][j]+b[i][]]&&s[a[i][j]]==s[a[i][j]+b[i][]]) return true;
for(int i=;i<=;i++)//对角线
if(s[a[i][]]!='O'&&s[a[i][]]==s[a[i][]+b[i][]]&&s[a[i][]]==s[a[i][]+b[i][]]&&s[a[i][]]==s[a[i][]+b[i][]]) return true;
return false;
}
int bfs()
{
string s,tmp;
while(!q.empty()){
s=q.front();q.pop();
if(check(s)) return mp[s]-;
for(int pos=;pos<;pos++)
for(int j=;j<=;j++){
string tmp=s;
if(pos==c[j][]||pos==c[j][]||pos==c[j][]||pos==c[j][]) continue;
if(s[pos+d[j]]=='O'&&s[pos]!='O') {
tmp=s;tmp[pos]=s[pos+d[j]];tmp[pos+d[j]]=s[pos];
if(!mp[tmp]) q.push(tmp),mp[tmp]=mp[s]+;
}
}
} return -;
}
int main()
{
char c[]; string s="";
for(int i=;i<=;i++){
scanf("%s",c+);
s=s+c[]+c[]+c[]+c[];
}
q.push(s);mp[s]=;
printf("%d\n",bfs());
return ;
}

HihoCoder1654: XY游戏([Offer收割]编程练习赛39)(好久没写搜索)(已经超级简短了)的更多相关文章

  1. [Offer收割]编程练习赛39

    公平分队 #pragma comment(linker, "/STACK:102400000,102400000") #include<stdio.h> #includ ...

  2. HihoCoder1665方块游戏([Offer收割]编程练习赛40)(线段树)

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho在玩一款类似俄罗斯方块的游戏.与原版俄罗斯方块不同的是,落下方块都是长度不一的横向长条,并且不能移动也不能变成竖直方 ...

  3. HihoCoder1653 : 公平分队([Offer收割]编程练习赛39)(贪心)

    描述 小Hi和小Ho在玩一个战争游戏.游戏中2N个战斗单位,其中第i个单位的战斗力是Ai. 现在小Hi和小Ho要各选N个单位组成队伍,当然他们都希望自己队伍的总战斗力越大越好. 为了使分队更加公平,经 ...

  4. HihoCoder1656 : 前缀后缀查询([Offer收割]编程练习赛39)(字典树+小技巧)

    描述 给定一个包含N个单词的字典:{W1, W2, W3, ... WN},其中第i个单词Wi有具有一个权值Vi. 现在小Hi要进行M次查询,每次查询包含一个前缀字符串Pi和一个后缀字符串Si.他希望 ...

  5. HihoCoder1655 : 第K小最简真分数([Offer收割]编程练习赛39)(唯一分解+容斥定理+二分)(不错的数学题)

    描述 给一个整数N,请你求出以N为分母的最简(既约)真分数中第K小的是多少? 输入 两个整数N个K. 对于30%的数据,1 <= N <= 1000000 对于100%的数据,1 < ...

  6. hihocoder [Offer收割]编程练习赛4

    描述 最近天气炎热,小Ho天天宅在家里叫外卖.他常吃的一家餐馆一共有N道菜品,价格分别是A1, A2, ... AN元.并且如果消费总计满X元,还能享受优惠.小Ho是一个不薅羊毛不舒服斯基的人,他希望 ...

  7. hihocoder [Offer收割]编程练习赛61

    [Offer收割]编程练习赛61 A:最小排列 给定一个长度为m的序列b[1..m],再给定一个n,求一个字典序最小的1~n的排列A,使得b是A的子序列. 贪心即可,b是A的子序列,把不在b中的元素, ...

  8. [Offer收割]编程练习赛46

    [Offer收割]编程练习赛46赛后题解 A.AEIOU 分析

  9. [Offer收割]编程练习赛97

    链接 [https://hihocoder.com/contest/offers97/problems] 题意 题目1 : 放置矩形 时间限制:10000ms 单点时限:1000ms 内存限制:256 ...

随机推荐

  1. curl库pycurl实例及参数详解

    pycurl是功能强大的python的url库,是用c语言写的,速度很快,比urllib和httplib都快. 今天我们来看一下pycurl的用法及参数详解 常用方法: pycurl.Curl() # ...

  2. Java IDL与javaRMI

    Registry registry = LocateRegistry.getRegistry(); registry.rebind(RemoteService.name, stub); Java 平台 ...

  3. freemark2pdf

    freemarker+ITextRenderer 生成html转pdf 博客分类: ITextRenderer ITextRenderer  网上已经有比较多的例子 写这个 但是很多都是简单的 dem ...

  4. vue proxyTable

    Vue-cli proxyTable 解决开发环境的跨域问题 字数474 阅读1685 评论1 喜欢3 和后端联调时总是会面对恼人的跨域问题,最近基于Vue开发项目时也遇到了这个问题,两边各自想了一堆 ...

  5. jdbcTemplaate queryForObject的两个易混淆的方法

    JdbcTemplate中有两个可能会混淆的queryForObject方法: 1.    Object queryForObject(String sql, Object[] args, Class ...

  6. Intellij IDEA如何不显示参数提示

    刚安装了IDEA之后,调用方法的时候会提示方法中的参数,就像下面这样: 虽然IDEA也是好心,提示,但是劳资看着难受啊. 如果觉得不习惯,不想看参数名,可以用下图的方式取消.具体是:  setting ...

  7. IIS7.5 配置ASP+ACCESS使用环境(转)

    Win7默认不安装IIS7.5. 安装的步骤为:开始-控制面板-程序-打开或关闭Windows功能-Internet信息服务.IIS7.5安装时需要注意的是,如果需要ASP.ASP.NET等的支持,是 ...

  8. EasyDSS RTMP流媒体服务器的HTTP接口query url的C++实现方法

    EasyDSS支持HTTP GET接口访问,我们需要获取url的各种参数信息 比如http://ip:port/action?a=1&b=2&c=3 我们需要知道对应的a.b.c的值 ...

  9. (转)javascript中call()、apply()、bind()的用法

    其实是一个很简单的东西,认真看十分钟就从一脸懵B 到完全 理解! 先看明白下面: 例1 obj.objAge;  //17 obj.myFun()  //小张年龄undefined 例2 shows( ...

  10. mysql服务突然不能启动

    mysql之前一直用的好好的,今天突然不能启动.前几天改过my.ini文件,在[mysqld]下添加了default-character-set=utf8.查看日志发现是添加的那句话的错误,删除.并且 ...