可以采用广度优先搜索,程序如下:
#include <iostream>#include <string>
#include <algorithm>
#include <set>
#include <queue>
using namespace std
struct node{
string str, step
node(){}
node(string str, string step = ""): str(str), step(step){}
}
int main(){
string start = "0111222", dest = "2221110"
node n
queue<node> Open
set<string> Close
Open.push(node(start))
while(1){
n = Open.front()
Open.pop()
Close.insert(n.str)
if(n.str == dest)break
int l = n.str.find("0")
for(int i=-3 i<=3 i++){
if(!i || l+i<0 || l+i>=dest.size())
continue
string s(n.str)
s[l] = s[l+i]
s[l+i] = '0'
if(Close.find(s) == Close.end())
Open.push(node(s, n.step + char('0'+l+i) + " "))
}
}
cout << n.step
}
程序输出:
1 4 2 5 6 3 0 2 5 6// 表示每一步移动哪个棋子,最开始棋子编号0
算法优化:可考虑使用A*算法进行启发式搜索
这个题目有点难度不过可用广度优先搜索算法:
棋盘的数据结构
{
int a[7]
int min_step
}
我大致写一下
两个数据结构
已搜状态队列q1
正在搜索的状态队列q2
main()
{
将初始节点加到q2;
while(q2 isn't empty)
{
new_s=takeout from q2
if(new_s belong to q1 or q2)
continue
else
{
if(new_s is target)
return
else
{
步数加一;
根据new_s扩展q2(最多4种可能);
}
}
}
a little suggestion,
just glance it!
thank you
}
1走棋规则游戏开始时每个玩家营区内有10个棋子成正三角放置,你的任务是将营区的所有棋子连走带跳去占领正对面的营区,首先将10个棋子全部占领对面营地的玩家获胜,其余玩家按到营的个数多少来排名次。
棋子的移动可以一步步在有直线连接的相邻六个方向进行,如果相邻位置上有任何方的一个棋子,该位置直线方向下一个位置是空的,则可以直接"跳"到该空位上,"跳"的过程中,只要相同条件满足就可以连续进行。谁最先把正对面的阵地全部占领,谁就取得胜利。
每一局棋都由程序随机产生一玩家先走,然后以该玩家为始点,逆时针方向轮流走棋。当轮过一圈到了起始玩家开始走棋时为走了一轮即一回合。我们不希望看长期将棋子放在家里,来阻止对手占领的打法,因此每位玩家在第 20 、 25 、 30 回合时,离开本营的棋子必须分别达到 5 、 8 、 10 颗,否则会被判消极而失败。
跳棋游戏中还具有托管功能,当你玩得累了想去泡杯咖啡时,你可以点屏幕右下角的“托管”按钮由机器人自动帮你走棋,当你人回来时也别忘了“接管”来继续游戏,因为机器人的智商是在人脑之下哦:)!
2游戏场次
跳棋分为2人场和6人场。由于6人场战局混乱又分为有提示场跟无提示场次,还是新手阶段的你可以先去有提示的6人场里练练。
3、 *** 作
1 .左键点击自己棋子,选择要走的棋子。
2 .棋子闪烁后,左键点击能走到得位置,棋子就会一蹦一跳的“跳”过去了。如果选择无法到达的位置是无法走棋的,系统会有错误的提示音,你可以另外选择可通行的路径走棋。
3 .如果中途想更换棋子,直接点选其他棋子即可。希望可以帮到你
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)