题意:俩个转盘,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. SPI核软件调试结果

    SPI核软件调试结果 一.硬件搭建 配置如下: 1.采用手动复位: 2.输入时钟27M,AXI总线工作频率100M: 3.axi_quad_spi 配置为标准模式: 4.配合软件例程的使用,挂载了CP ...

  2. MySQL Binlog解析

    https://yq.aliyun.com/articles/238364?spm=5176.8067842.tagmain.52.73PjU3 摘要: 概述 MySQL的安装可以参考:Linux(C ...

  3. js控制html5 【video】标签中视频的播放和停止

    需求:页面中有2个普通按钮a,b.还有一个video标签,能成功播放出视频..我想要的效果是,点击a按钮,视频开始播放,点击b按钮,视频播放停止!!!<br><br>----- ...

  4. 【巷子】---redux---【react】

    一.flux的缺陷 因为dispatcher和Store可以有多个互相管理起来特别麻烦 二.什么是redux 其实redux就是Flux的一种进阶实现.它是一个应用数据流框架,主要作用应用状态的管理 ...

  5. github简单命令

    1.安装yum install -y git 2.配置帐户(github.com注册)git config --global user.name goozgkgit config --global u ...

  6. 运营站点-开放robots后,站内google搜索数量第二天10条左右,第5天搜录9920条,可喜可贺

    开放robots后,站内google搜索数量第二天10条左右,第5天搜录9920条,可喜可贺 2014年4月29日 16:17:56 到目前为之已搜录14000多条,已有客户在网站注册,加入购物车

  7. P3811 乘法逆元

    传送 乘法逆元:ax ≡ 1 (mod p),其中x为a的逆元,求模意义下的乘法逆元,通常有一下几种方法: 1.拓展欧几里得(也就是exgcd) ax ≡ 1 (mod p) ax-py=1 这就变成 ...

  8. jdbi

    JDBI是一个使用方便的SQL开发库,用符合Java语言习惯的集合.Bean等方式,提供关系数据库访问接口,同时保留了JDBC类似的信息.JDBI提供了链式和SQL两种风格的API. jdbi的网址是 ...

  9. css属性—position的使用与页面的分层介绍

    一.引言: 在css众多属性中,position算是里面用的比较多也相对来说比较重要的属性了,它对于单个标签的“定位”.标签之间的“相对位置定位”还有网页的分层来说十分重要! 二.“定位的实现”具体介 ...

  10. Jmeter(三十九)User.Properties定义全局变量

    “烟”从物质上满足吸烟者对尼古丁的依赖,但“烟”更从精神上满足了人们对“思想”的欲望---在抽烟的时刻,每个男人都可能成为思想家. ---<冲突> 前面有记到jmeter读取外部文件内容的 ...