uva-704-暴力枚举-双向bfs
题意:俩个转盘,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的更多相关文章
- POJ 3170 Knights of Ni (暴力,双向BFS)
题意:一个人要从2先走到4再走到3,计算最少路径. 析:其实这个题很水的,就是要注意,在没有到4之前是不能经过3的,一点要注意.其他的就比较简单了,就是一个双向BFS,先从2搜到4,再从3到搜到4, ...
- uva 11088 暴力枚举子集/状压dp
https://vjudge.net/problem/UVA-11088 对于每一种子集的情况暴力枚举最后一个三人小组取最大的一种情况即可,我提前把三个人的子集情况给筛出来了. 即 f[S]=MAX{ ...
- Uva 1599 Ideal Path - 双向BFS
题目连接和描述以后再补 这题思路很简单但还真没少折腾,前后修改提交了七八次才AC...(也说明自己有多菜了).. 注意问题: 1.看清楚原题的输入输出要求,刚了书上的中文题目直接开撸,以为输入输出都是 ...
- 【暴力枚举&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 ...
- UVA.12716 GCD XOR (暴力枚举 数论GCD)
UVA.12716 GCD XOR (暴力枚举 数论GCD) 题意分析 题意比较简单,求[1,n]范围内的整数队a,b(a<=b)的个数,使得 gcd(a,b) = a XOR b. 前置技能 ...
- UVA - 1601 The Morning after Halloween (双向BFS&单向BFS)
题目: w*h(w,h≤16)网格上有n(n≤3)个小写字母(代表鬼).要求把它们分别移动到对应的大写字母里.每步可以有多个鬼同时移动(均为往上下左右4个方向之一移动),但每步结束之后任何两个鬼不能占 ...
- 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 ...
- 【UVa】1601 The Morning after Halloween(双向bfs)
题目 题目 分析 双向bfs,对着书打的,我还调了好久. 代码 #include<cstdio> #include<cstring> #include<c ...
- UVA - 11464 Even Parity 【暴力枚举】
题意 给出一个 01 二维方阵 可以将里面的 0 改成1 但是 不能够 将 1 改成 0 然后这个方阵 会对应另外一个 方阵 另外一个方阵当中的元素 为 上 下 左 右 四个元素(如果存在)的和 要求 ...
随机推荐
- mariadb开机自启
执行命令:systemctl enable mariadb 并由此想到,添加服务自启的命令格式: systemctl enable 服务名 当然关闭服务自启也是可以得: systemctl disab ...
- C++和extern C
http://blog.csdn.net/gongmin856/article/details/44228453 C语言中的可变参数:va_list ,va_start,va_arg,va_end h ...
- WebService的几种验证方式
转 http://www.cnblogs.com/yoshiki1895/archive/2009/06/03/1495440.html WebService的几种验证方式 1.1 WebS ...
- DataGridView之编码列重绘
实现方式如下: private void dgvRelation_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) { ...
- Java课程设计(2019版)
参考资料 Java课程设计参考资料(2018-12-26更新) Java课程设计常见问题(程序部署.数据库.JSP) 项目开发参考-阿里巴巴Java开发手册(正式版) 更多参考资料请查看QQ群文件中的 ...
- tomcat源码 StandardServer
在执行org.apache.catalina.startup.Catalina#load的时候会执行org.apache.catalina.core.StandardServer#init,然后会调到 ...
- defaultProps和propTypes
在上一篇文章中总结了父子组件的数据传递,下面先来简单的回顾一下之前的内容: 此时,子组件中div里面的数据依赖于父组件传递过来的数据,那么当父组件没有给子组件传递数据时,子组件div里面就没有了数据了 ...
- MySQL总论
1. MySQL基本概念 1.1. 数据库的概念 数据库,简而言之就是存储数据的仓库,可以按照一定的数据结构存储管理大量的数据及数据与数据之间的关系,它本质上是一种信息管理系统.数据库根据存储采用的 ...
- 学习笔记之Python全栈开发/人工智能公开课_腾讯课堂
Python全栈开发/人工智能公开课_腾讯课堂 https://ke.qq.com/course/190378 https://github.com/haoran119/ke.qq.com.pytho ...
- [UE4]一分钟实现聊天系统
天系统:客户端发消息到服务器端,服务器端把收到的消息广播到所有客户端. 由于聊天对象需要支持“可复制”和每个客户端都发给一个,所以GameInstance.GameModeGameState都不适合存 ...