c++用队列求最短路径问题

来源:百度知道 编辑:UC知道 时间:2024/06/14 00:49:59
一个类似农夫过河的程序:

有三个人(他们的体重是Q,P,T)被困在塔顶,塔下面有一个重量为S的石头,

塔上面有一个滑轮,两边能乘人,这3个人想利用塔下的石头逃出去

滑轮两边的重量如果不大于D的话,人就可以平安落地(石头当然可以直接从塔顶扔下去就行)

问题是:分别输入S,D,Q,P,T,用c++的队列来求出最短路径

比如,输入(S D Q P T)
30 6 78 42 36
输出是:TOWER# GROUND
0 : QPT_#___S
1 : QP_S#__T_
2 : Q_TS#_P__
3 : Q_T_#_P_S
4 : _PTS#Q___
5 : _PT_#Q__S
6 : _P_S#Q_T_
7 : __TS#QP__
8 : __T_#QP_S
9 : ___S#QPT_

就是这样一个程序,高手帮忙,谢谢
不知道的不要乱写

别像1楼似的不知在哪地方弄来的莫名其妙的代码也往上写

//我的解答,请参考。如果有不明白的,请百度mail 或者百度hi我。
//解题思路,用二进制位保存现在状况(哪些在塔顶,哪些在塔底),1表示在塔顶,0表示在塔底。然后对状态进行广度优先搜索(广度优先搜索得到的结果一定是最优的)。
/*
一个类似农夫过河的程序:

有三个人(他们的体重是Q,P,T)被困在塔顶,塔下面有一个重量为S的石头,

塔上面有一个滑轮,两边能乘人,这3个人想利用塔下的石头逃出去

滑轮两边的重量如果不大于D的话,人就可以平安落地(石头当然可以直接从塔顶扔下去就行)

问题是:

分别输入S,D,Q,P,T,用c++的队列来求出最短路径

比如,输入(S D Q P T)
30 6 78 42 36
输出是:
TOWER# GROUND
0 : QPT_#___S
1 : QP_S#__T_
2 : Q_TS#_P__
3 : Q_T_#_P_S
4 : _PTS#Q___
5 : _PT_#Q__S
6 : _P_S#Q_T_
7 : __TS#QP__
8 : __T_#QP_S
9 : ___S#QPT_
*/
#include <iostream>
#include <string>
#include <vector>
#include <queue>
using namespace std;

const string INDEX="STPQ";

int s,d,q,p,t;
int w[4];

struct OP
{
OP(int i1=0,int i2=0):idx1(i1),idx2(i2){}
int idx1;
int idx2;
};