题意:俩个转盘,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. SDRAM的初始化与刷新操作---看时序图写代码

    SDRAM的初始化与刷新操作---看时序图写代码 1.SDRAM的常见操作 2.初始化就是配置SDRAM 3.SDRAM初始化时序 时序解释如下: 4.刷新操作

  2. ubuntu如何为获得root权限

    在终端中输入:sudo passwd rootEnter new UNIX password: (在这输入你的密码)Retype new UNIX password: (确定你输入的密码)passwd ...

  3. Hiero中的Events机制

    The hiero.core.events module allows you to register method callbacks to respond to events sent by Hi ...

  4. Web Services and C# Enums

    Web Service Transparency .NET support for web services is excellent in creating illusion of transpar ...

  5. RTB业务知识之2-Impression概念和关键属性

    一.定义-impression This object describes an ad placement or impression being auctioned. A single bid re ...

  6. ThreadPoolExecutor简单学习

    Executors和ThreadPoolExecutor两者的区别和联系 jdk中文文档 https://blog.fondme.cn/apidoc/jdk-1.8-google/ 还可以的两个博客 ...

  7. android 退出程序解决内存释放so的问题

    做Android程序的时候发现一个问题,由于用到了so库,当应用程序退出了,但是手机变得很卡,点击"设置"查看应用程序,界面显示着可以点击"强制关闭". 由于这 ...

  8. Hadoop错误集:Could not find the main class: org.apache.hadoop.*

    在搭建Hadoop机群的时候,之前遇见了很多次找不到类的错误,因为对Hadoop了解不深,所以就在网上漫无目的的找解决方案,所以这里总结下我用的方法. 解决办法一: 我之前遇到了找不到 org.apa ...

  9. console.log()换行和document.write()换行

    <!DOCTYPE html><html ><head><meta charset="utf-8"><title>ddd ...

  10. IDC:UPS(不间断电源)

    ylbtech-IDC:UPS(不间断电源) UPS(Uninterruptible Power System/Uninterruptible Power Supply),即不间断电源,是将蓄电池(多 ...