题意:俩个转盘,24个数字,每个转盘都可以顺时针,逆时针旋转.终点固定.

问:给定一个起点,能不能在16步内转到终点

解法:双向bfs,终点走8步,起点走8步,判断从起点生成的状态是否在终点里面,如果在即是有解

注意题目要输出转动的方向,并且方向字符串要最小,所以,在某一步有解事,要把当前层数走完,取最小值

#include <iostream>
#include<map>
#include<memory.h>
#include<stdio.h>
#include<string>
#include<queue> using namespace std; const int MAXN = ; string zhuan(string str, int way)
{
string reStr(str);
if (way == )
{
//左边顺时针旋转
char sb1 = str[];
char sb2 = str[];
for (int i = ;i >= ;i--)
reStr[i] = reStr[i - ];
reStr[] = sb2;
reStr[] = sb1;
reStr[] = reStr[];
reStr[] = reStr[];
reStr[] = reStr[];
}
else if (way == )
{
//左边逆时针旋转
char sb1 = reStr[];
char sb2 = reStr[];
for (int i = ;i < ;i++)
reStr[i] = reStr[i + ];
reStr[] = sb2;
reStr[] = sb1;
reStr[] = reStr[];
reStr[] = reStr[];
reStr[] = reStr[];
}
else if (way == )
{
//右边顺时针旋转
char sb1 = reStr[];
char sb2 = reStr[];
for (int i = ;i < ;i++)
reStr[i] = reStr[i + ];
reStr[] = sb2;
reStr[] = sb1;
reStr[] = reStr[];
reStr[] = reStr[];
reStr[] = reStr[];
}
else
{
//右边逆时针旋转
char sb1 = reStr[];
char sb2 = reStr[];
for (int i = ;i >= ;i--)
reStr[i] = reStr[i - ];
reStr[] = sb2;
reStr[] = sb1;
reStr[] = reStr[];
reStr[] = reStr[];
reStr[] = reStr[];
}
return reStr;
} class Node
{
public:
string str;
string step;
int stepNum;
bool operator < (const Node& node) const
{
return stepNum > node.stepNum;
}
}; const static string endState = "034305650121078709a90121";
map<string, string> sMap;
map<string, string>eMap;
priority_queue<Node> q; int ok = ;
string curStep = ""; string path(string es)
{
string str = "";
for (int i = es.size() - ; i >= ;i--)
{
if (es.at(i) == '') str+= "";
else if (es.at(i) == '') str += "";
else if (es.at(i) == '')str += "";
else if (es.at(i) == '') str += "";
}
return str;
} //
void bfsEnd()
{
while (!q.empty())
q.pop();
Node n;
n.step = "";
n.stepNum = ;
n.str = endState;
q.push(n);
eMap[endState] = "";
while (!q.empty())
{
n = q.top();
q.pop();
if (n.stepNum == )
break;
for (int i=;i<=;i++)
{
string str = zhuan(n.str, i);
if (eMap.find(str) == eMap.end())
{
string sstep(n.step);
sstep += i + '';
Node nn;
nn.stepNum = n.stepNum + ;
nn.str = str;
nn.step = sstep;
q.push(nn);
eMap[str] = sstep;
}
}
}
} void bfsStart(string str)
{
while (!q.empty())
q.pop();
Node n;
n.step = "";
n.stepNum = ;
n.str = str;
q.push(n);
int okStep = INT32_MAX;
while (!q.empty())
{
n = q.top();
q.pop();
if (ok && n.stepNum != okStep)
break;
if (eMap.find(n.str) != eMap.end())
{
if (ok == )
{
curStep = n.step+path(eMap.find(n.str)->second);
okStep = n.stepNum;
ok = ;
}
else
{
string step = n.step + path(eMap.find(n.str)->second);
//判断大小
if (strcmp(curStep.c_str(), step.c_str()) > )
curStep = step;
}
}
if (ok)
continue;
for (int i = ; i <= && n.stepNum != ; i++)
{
str = zhuan(n.str,i);
if (sMap.find(str) == sMap.end())
{
string sstep(n.step);
sstep += i + '';
Node nn;
nn.stepNum = n.stepNum + ;
nn.str = str;
nn.step = sstep;
sMap[str] = sstep;
q.push(nn);
}
}
} }
int main()
{ int k = ;
cin >> k;
eMap.clear();
bfsEnd();
while (k--)
{
ok = ;
sMap.clear();
string str = "";
int j;
for (int i = ;i < MAXN;++i)
{
cin >> j;
if (j == )
str += 'a';
else
str += j + '';
} if (str == endState)
{
cout << "PUZZLE ALREADY SOLVED" << endl;
continue;
}
bfsStart(str);
if (ok==)
{
cout << "NO SOLUTION WAS FOUND IN 16 STEPS" << endl;
continue;
}
cout << curStep << endl; } }

uva-704-暴力枚举-双向bfs的更多相关文章

  1. POJ 3170 Knights of Ni (暴力,双向BFS)

    题意:一个人要从2先走到4再走到3,计算最少路径. 析:其实这个题很水的,就是要注意,在没有到4之前是不能经过3的,一点要注意.其他的就比较简单了,就是一个双向BFS,先从2搜到4,再从3到搜到4, ...

  2. uva 11088 暴力枚举子集/状压dp

    https://vjudge.net/problem/UVA-11088 对于每一种子集的情况暴力枚举最后一个三人小组取最大的一种情况即可,我提前把三个人的子集情况给筛出来了. 即 f[S]=MAX{ ...

  3. Uva 1599 Ideal Path - 双向BFS

    题目连接和描述以后再补 这题思路很简单但还真没少折腾,前后修改提交了七八次才AC...(也说明自己有多菜了).. 注意问题: 1.看清楚原题的输入输出要求,刚了书上的中文题目直接开撸,以为输入输出都是 ...

  4. 【暴力枚举&BFS】Flow Free @RMRC2017/upcexam5124

    时间限制: 1 Sec 内存限制: 128 MB 题目描述 Flow Free is a puzzle that is played on a 2D grid of cells, with some ...

  5. UVA.12716 GCD XOR (暴力枚举 数论GCD)

    UVA.12716 GCD XOR (暴力枚举 数论GCD) 题意分析 题意比较简单,求[1,n]范围内的整数队a,b(a<=b)的个数,使得 gcd(a,b) = a XOR b. 前置技能 ...

  6. UVA - 1601 The Morning after Halloween (双向BFS&单向BFS)

    题目: w*h(w,h≤16)网格上有n(n≤3)个小写字母(代表鬼).要求把它们分别移动到对应的大写字母里.每步可以有多个鬼同时移动(均为往上下左右4个方向之一移动),但每步结束之后任何两个鬼不能占 ...

  7. UVA 10012 How Big Is It?(暴力枚举)

      How Big Is It?  Ian's going to California, and he has to pack his things, including his collection ...

  8. 【UVa】1601 The Morning after Halloween(双向bfs)

    题目 题目     分析 双向bfs,对着书打的,我还调了好久.     代码 #include<cstdio> #include<cstring> #include<c ...

  9. UVA - 11464 Even Parity 【暴力枚举】

    题意 给出一个 01 二维方阵 可以将里面的 0 改成1 但是 不能够 将 1 改成 0 然后这个方阵 会对应另外一个 方阵 另外一个方阵当中的元素 为 上 下 左 右 四个元素(如果存在)的和 要求 ...

随机推荐

  1. 排序算法<No.2>【快速排序】

    最近因为项目需要,研究AI相关的东西,主要是算法相关的. 有感触,所以决定,来一个系列的博文,可能会耗时很久,那就是要完成算法系列.起点,从最常用最基本的排序开始.后续会跟进其他类型的,比如树,图等领 ...

  2. php+phpspreadsheet读取Excel数据存入mysql

    先生成Excel模板,然后导入Excel数据到mysql,每条数据对应图片上传到阿里云 <?php /** * Created by PhpStorm. * User: Administrato ...

  3. error: C++ preprocessor "/lib/cpp" fails sanity check错误解决方法

    error: C++ preprocessor "/lib/cpp" fails sanity check 问题的解决 问题的根源是缺少必要的C++库.如果是CentOS系统,运行 ...

  4. 关于AXI_Quad_SPI的寄存器配置

    关于AXI_Quad_SPI的寄存器配置 1.核初始化配置 首先是: 40:0000_000A 1C:8000_0000 28:0000_0004 2.命令与dummy_data 60:000001E ...

  5. VSFTP再配置 我里个去马蛋网上这么多烂文章,走了好多弯路

    1.CentOS 进行yum 安装 vsftpd 2.vi /etc/vsftpd/vsftpd.conf  进行配置 3.创建FTP 用户 # useradd –d /var/www -g ftp ...

  6. WIN10 网速问题,边下载 边逛论坛 电脑 有点卡

    引用:https://www.chiphell.com/forum.php?mod=viewthread&tid=1961836&extra=page%3D1&mobile=2 ...

  7. gcc同时使用动态和静态链接

    场景是这样的.我在写一个Nginx模块,该模块使用了MySQL的C客户端接口库libmysqlclient,当然mysqlclient还引用了其他的库,比如libm, libz, libcrypto等 ...

  8. Osip2和eXosip协议栈的简析

    Osip2是一个开放源代码的sip协议栈,是开源代码中不多使用C语言写的协议栈之一,它具有短小简洁的特点,专注于sip底层解析使得它的效率比较高. eXosip是Osip2的一个扩展协议集,它部分封装 ...

  9. 生成器&迭代器,模块

    列表生成式 将列表data=[1,2,3]里的元素都乘2 方法一 data=[1,2,3] for index,i in enumerate(data): data[index] *=2 print( ...

  10. CentOS7安装配置PostgreSQL9.6

    本文涉及CentOS7下PostgreSQL9.6的yum安装,访问配置及简单使用. 一.验证环境 1. 操作系统 CentOS-7-x86_64-Everything-1511 2. Postgre ...