描述

如下图所示,在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. WinForm搭载ScintillaNET时文本由于发生偏移被隐藏解决方案

    项目用ScintillaNet搭载到WinForm以满足文本编辑的需求,在用FindReplace.Scintilla.Text=“显示内容”输出文本内容的时候会碰到文本被WinForm边框隐藏的情况 ...

  2. rtems 4.11 console驱动 (arm, beagle)

    console驱动框架主要文件是 c/src/lib/libbsp/shared/console.c,驱动的入口是 console_initialize()主要作用是初始化BSP提供的全局变量 Con ...

  3. 深入理解Java 8 Lambda

    - 转载:blog1, blog2 以上两篇博客是对lambda表达式的深入理解,用于后续加深理解. 如下先从零开始理解lambda, 1. 接触lambda表达式是从python,javascrip ...

  4. 部署mongodb中需要注意的调参

    部署mongodb的生产服务器,给出如下相关建议: 使用虚拟化环境: 系统配置 1)推荐RAID配置 RAID(Redundant Array of Independent Disk,独立磁盘冗余阵列 ...

  5. 【文献阅读】Stack What-Where Auto-encoders -ICLR-2016

    一.Abstract 提出一种新的autoencoder -- SWWAE(stacked what-where auto-encoders),更准确的说是一种 convolutional autoe ...

  6. 【BZOJ3489】A simple rmq problem kd-tree

    [BZOJ3489]A simple rmq problem Description 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过 ...

  7. zookeeper_action

    连接串 从节点列表本地缓存主节点对未分配的任务,随机分配给从节点(不合理??)从节点保存一个本地待执行任务列表单独的线程对节点已分配任务进行循环 进程p为了获锁——>创建节点znode_/loc ...

  8. cocos2d-js添加广点通插屏(通过jsb反射机制)

    1.把广点通的jar包加入libs文件夹 2.修改AndroidManifest.xml文件 添加权限: <uses-permission android:name="android. ...

  9. mysql一:操作数据库

    创建数据库是指在数据库空间中划出一块空间用来存储相关的数据,表就是存储在对应的数据库里面.首先来看下查看数据库的命令:show databases. 这个是用来查询数据库空间下所有的数据库,其中inf ...

  10. Spring/Java error: namespace element 'annotation-config' … on JDK 1.5 and higher

    Extract the jar file: mkdir spring cd spring jar xvf ../spring.jar Check the Spring version in META- ...