急需15数码算法和源程序

02051223 2004-11-01 10:05:35



急需15数码算法和源程序,哪个会请指导并E-mail我。

chenlei_tc@yahoo.com.cn
...全文
201 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
02051223 2004-11-25
  • 打赏
  • 举报
回复


哦!
qidaozhilong 2004-11-22
  • 打赏
  • 举报
回复
华容道,鉴定完毕!
02051223 2004-11-22
  • 打赏
  • 举报
回复



这个怎么和我写的相差这么大呀!

我写的很长,用的数据结构也不一样(结构体)。

有没有 和我的想法一样的程序呀??
miky 2004-11-11
  • 打赏
  • 举报
回复
拼图算法
拼图游戏的算法
(加入日期:2003-6-20 点击数:3138)
【对此文发表评论】 【编程爱好者论坛】 【保存文章至硬盘】 【打印文章】


相信大家都玩过"滑块拼图"游戏!
大概说一下 :假如一副图是由几个部分拼凑成的,现在要你把这些散块拼凑成一副完整的图片
也可以是几个数字来拼凑
比如 3*3的格子
1 2 3
4 5 6
7 8 (相当于原始矩阵)
有一个格子是空的现在要你组合成
1 2 7
3 6 4
5 8 (目标矩阵)
问题是编写一种算法 能根据输入的原始图形(矩阵)拼凑成目标图形(目标矩阵) 要求是步数最少(耗时间最少)
#include"iostream.h"
struct node{
int nodesun[4][4];

int x,y;
}path[1000];
int zx[4]={-1,0,1,0};
int zy[4]={0,-1,0,1};
int top;
int desti[4][4];//目标状态
int detect(struct node *p)
{int i,j;
for(i=1;i<4;i++)
for(j=1;j<4;j++)
if(p->nodesun[i][j]!=desti[i][j])
return 0;
return 1;
}

void printlj()
{int tempt;
int i,j;
tempt=1;
while(tempt<=top)
{ for(i=1;i<4;i++)
for(j=1;j<4;j++)
{cout<<path[tempt].nodesun[i][j];
if(j==3)
cout<<" "<<endl;
}
tempt++;
}
}




void main()
{ //初始化
int i,j,m,n,f;
int temp,find=0;
top=1;
for(i=1;i<4;i++)
for(j=1;j<4;j++)
{cout<<"请输入第"<<i<<"行"<<"第"<<j<<"列的值"<<endl;
cin>>temp;
path[1].nodesun[i][j]=temp;
}
cout<<"请输入初始状态的空格的位置(行)"<<endl;
cin>>temp;
path[1].x=temp;
cout<<"请输入初始状态的空格的位置(列)"<<endl;
cin>>temp;
path[1].y=temp;
//目标状态
for(i=1;i<4;i++)
for(j=1;j<4;j++)
{cout<<"请输入目标状态第"<<i<<"行"<<"第"<<j<<"列的值"<<endl;
cin>>temp;
desti[i][j]=temp;
}
//深度优先搜索
while(!find)
{ m=path[top].x;
n=path[top].y ;
for(f=0;f<4;f++)
{i=m+zx[f];
j=n+zy[f];
if(i>=1&&i<=3&&j>=1&&j<=3)
{top++;
path[top]=path[top-1];
path[top].nodesun[m][n]=path[top-1].nodesun[i][j];
path[top].nodesun[i][j]=0;

path[top].x=i;
path[top].y=j;

if(detect(&path[top]))
{printlj();
find=1;
break;
}

break;
}//if

}//for

}//while
}



#include"iostream.h"
struct node{
int nodesun[4][4];
int pre;
int x,y;
}path[400];
int zx[4]={-1,0,1,0};
int zy[4]={0,-1,0,1};
int front,rear;
int desti[4][4];//目标状态
int detect(struct node *p)
{int i,j;
for(i=1;i<4;i++)
for(j=1;j<4;j++)
if(p->nodesun[i][j]!=desti[i][j])
return 0;
return 1;
}

void printlj()
{int tempt;
int i,j;
tempt=rear;
while(tempt!=0)
{ for(i=1;i<4;i++)
for(j=1;j<4;j++)
{cout<<path[tempt].nodesun[i][j];
if(j==3)
cout<<" "<<endl;
}
tempt=path[tempt].pre;
}
}




void main()
{ //初始化
int i,j,m,n,f;
int temp,find=0;
front=rear=1;
path[1].pre=0;
for(i=1;i<4;i++)
for(j=1;j<4;j++)
{cout<<"请输入第"<<i<<"行"<<"第"<<j<<"列的值"<<endl;
cin>>temp;
path[1].nodesun[i][j]=temp;
}
cout<<"请输入初始状态的空格的位置(行)"<<endl;
cin>>temp;
path[1].x=temp;
cout<<"请输入初始状态的空格的位置(列)"<<endl;
cin>>temp;
path[1].y=temp;
//目标状态
for(i=1;i<4;i++)
for(j=1;j<4;j++)
{cout<<"请输入目标状态第"<<i<<"行"<<"第"<<j<<"列的值"<<endl;
cin>>temp;
desti[i][j]=temp;
}
//广度优先搜索
while(front<=rear&&!find)
{ m=path[front].x;
n=path[front].y ;
for(f=0;f<4;f++)
{i=m+zx[f];
j=n+zy[f];
if(i>=1&&i<=3&&j>=1&&j<=3)
{rear++;
path[rear]=path[front];
path[rear].nodesun[m][n]=path[front].nodesun[i][j];
path[rear].nodesun[i][j]=0;
path[rear].pre=front;
path[rear].x=i;
path[rear].y=j;
if(detect(&path[rear]))
{printlj();
find=1;
break;
}
}
}
front++;
}
}

上面是用最简单的深度优先,广度优先直接搜索得来得,毫无AI可言,这并不说明我不能写出其更好得算法,这里最简单得的估价函数f(x)=g(x)+h(x)
g(x)用初始化的节点到当前的节点的路径长度来表示h(x)启发函数用当前状态和目标状态的位置不同的个数来表
到156.com可以看我的根多文章



看不清楚就去这看:http://www.programfan.com/showarticle.asp?id=2276
02051223 2004-11-10
  • 打赏
  • 举报
回复


就是你输入的一个数列(程序中用2维数组表示)。


比如 1 2 3 4 是目标,再输入起始的,经过扩展节点(移动空格,上。下。左,右)得到目标。
12 13 14 5
11 15 6
10 9 8 7
of123 2004-11-08
  • 打赏
  • 举报
回复
要求能够排列成目标顺序—什么意思?
02051223 2004-11-08
  • 打赏
  • 举报
回复




排序?不是吧!

那帖子在哪里呢?我没有找到啊。
GGL123 2004-11-07
  • 打赏
  • 举报
回复
呵呵 这么复杂 偶不懂 学习!
nofound007 2004-11-07
  • 打赏
  • 举报
回复
搞不懂!
a达哥a 2004-11-06
  • 打赏
  • 举报
回复
玩华容道啊?
northwolves 2004-11-06
  • 打赏
  • 举报
回复
相当于排序,冒泡法,插入法,快速排序都可以,搜搜以前的帖子
02051223 2004-11-06
  • 打赏
  • 举报
回复



有16个空(大方框里面),空里有1到15这15个数,把他们打乱顺序后,要求能够排列成目标顺序。

哪个能够用算法实现就行了(VB或者是C)。
xiaoyuanzhi 2004-11-02
  • 打赏
  • 举报
回复
不懂你的要求啊, 详细点
guoxu_009 2004-11-02
  • 打赏
  • 举报
回复
不懂15算法是什么。
cosio 2004-11-02
  • 打赏
  • 举报
回复
15数码算法?不懂?
a达哥a 2004-11-01
  • 打赏
  • 举报
回复
不懂你的要求啊, 详细点!

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧