读书人

模拟迷宫 找出最短通路 VC++6.0 数

发布时间: 2012-02-25 10:01:48 作者: rapoo

模拟迷宫 找出最短通路 VC++6.0 数据结构列队的应用 100分酬谢
rt

[解决办法]
一个二维数组,先深搜索~+最短路记录剪枝
ACM里面常用的方法
[解决办法]
最短路要用广度优先搜索。
[解决办法]
打错了~
或者用神器:
boost::graph巨无霸~
[解决办法]
up
[解决办法]
深度、广度、A*、水淹……
我最喜欢的就是双向水淹,编程最简单,小地图强烈推荐
[解决办法]
mark
[解决办法]
#include "iostream.h "



template <class State>
class WalkThrough
{
public:
typedef bool (*StateJumper)(State&);
typedef bool (*Matcher)(const State&);

WalkThrough(): overFlag(false), Jumper(0), IsMatch(0) { }
WalkThrough(const State& s, StateJumper j = 0, Matcher m = 0)
: overFlag(false), curState(s), Jumper(j), IsMatch(m) { }
virtual ~WalkThrough() { }

void setJumper(const StateJumper j) { Jumper = j; }
void setMatcher(const Matcher m) { IsMatch = m; }

void setState(const State& s) { curState = s; }
State getState() const { return curState; }

bool getNextFilter();
bool isOver() const { return overFlag; }

private:
State curState;
bool overFlag;
StateJumper Jumper;
Matcher IsMatch;
};


template <class State>
bool WalkThrough <State> ::getNextFilter()
{
if (overFlag) // 若已完成遍历,则直接返回
return false;
if (!Jumper || !IsMatch) // 若用户未定义Jumper或IsMatch函数,则返回
{
overFlag = true; // 这里将没有定义Jumper或IsMatch的穷举视为遍历完成
return false; // 不过,如果你认为两者绝不能等同,也可以抛出异常
}
while (!(overFlag = !Jumper(curState)) && !IsMatch(curState))
; // 获取下一状态,直到找到可行状态或者遍历完成
if (overFlag) // 根据遍历完成情况决定返回值
return false;
else
return true;
}

class Pair
{
public:
Pair(int mx = 0, int my = 0): x(mx), y(my) { }
int x, y;
};


bool counter(Pair& pair)
{
if (pair.y < 99)
++pair.y;
else
{
if (pair.x < 99)
{
++pair.x;
pair.y = 0;
}
else
return false;
}
return true;
}


bool match(const Pair& pair)
{
return (pair.x + pair.y) == 50;
}


int main()
{
WalkThrough <Pair> sf50(Pair(0, -1), &counter, &match);
while (sf50.getNextFilter())
cout < < sf50.getState().x < < " + " < < sf50.getState().y < < " = 50 " < < endl;


return 0;
}
[解决办法]
mark

读书人网 >C++

热点推荐