九宫算法求解

fish_yu 2003-10-23 02:01:02
九宫题:
1 3 5 1 2 3
6 8 2 -------> 8 4
4 7 7 6 5

的算法哪位大虾能够提供一下(第一张图的数字是任意排列的).
...全文
193 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
stefant2003 2003-10-25
  • 打赏
  • 举报
回复
参考人工智能中的“启发式搜索”部分,几乎任何一本人工智能书中都有介绍
推荐Nilsson的《Artificial Intelligence》,机械工业
讲的简明易懂
answerear 2003-10-24
  • 打赏
  • 举报
回复
#include <iostream.h>
#include <time.h>
#include <stdlib.h>

int func(int a[],int n)
{
int sum=0;
for(int i=0;i<7;i++)
int m+=(a[i]+a[i+1]+a[i+2]-15)*(a[i]+a[i+1]+a[i+2]-15); //计算每行的和与15的误差
for(i=0;i<3;i++)
int n+=(a[i]+a[i+3]+a[i+6]-15)*(a[i]+a[i+3]+a[i+6]-15); //计算每列的和与15的误差
sum+=m+n+(a[0]+a[4]+a[8])*(a[0]+a[4]+a[8])+(a[2]+a[4]+a[6])*(a[2]+a[4]+a[6]);
return sum;
}

void main()
{
for(int i=0;i<9;i++)
a[i]=i++; //付初值
int e=func(a,9); //给e赋初值
srand(time(NULL));
while(e)
{
i=rand()%9;
int j=rand()%9;
temp=a[i];
a[i]=a[j];
a[j]=temp;

int e1=func(a,9);

if(e1<e)
e=e1;
}
for(i=0;i<9;i++)
cout<<a[i]<<' ';
cout<<endl;
}

此算法是通过减少误差来逼近结果.当误差为0时就是最终结果.中间主要通过随机调换两个数组中的数来改变误差e1的值.
pigsanddogs 2003-10-24
  • 打赏
  • 举报
回复
听课
fish_yu 2003-10-24
  • 打赏
  • 举报
回复
我很想要,能不能给我?我的邮箱是fish_yzl@hotmail.com
bm1408 2003-10-24
  • 打赏
  • 举报
回复
我写过这样的程序用C写的!

不是很难,主要是利用中间的空格来移动!其中最有技术的是,要设计好装这8个数的方陈!
巧妙的利用下标,做起来就容易了!

实在想要代码的话,给我刘言吧!
时间关系上面的关代没有看,我想思路应该是一样的!
fish_yu 2003-10-24
  • 打赏
  • 举报
回复
楼上概念错误了!这样的话怎么挪动呢?
wadefelix 2003-10-24
  • 打赏
  • 举报
回复
九宫应该是这样吧:
8 1 6
3 5 7
4 9 2
minghui000 2003-10-23
  • 打赏
  • 举报
回复
good
pk2001 2003-10-23
  • 打赏
  • 举报
回复
有一点明白了,很好
54sg 2003-10-23
  • 打赏
  • 举报
回复
哭..你看看我提问的那个问题:关于滑块拼图的算法,
没人理我.其实就是一个十六宫问题,不过要比九宫复杂的多.
fish_yu 2003-10-23
  • 打赏
  • 举报
回复
非常感谢54sg(),我正在研究!能不能留一下你的邮箱或者qq号?
liansdan 2003-10-23
  • 打赏
  • 举报
回复
听课
54sg 2003-10-23
  • 打赏
  • 举报
回复
(八数码问题) 8个编有数码1 ̄8的滑牌,能在3*3的井字格中滑动。井

字格中有一格是空格,用0表示,因而空格周围的数码滑牌都可能滑到空格中去.

下图是数码滑牌在井字格中的两种状态:

┎─┬─┬─┒ ┏━┯━┯━┓

┃2 │8 │3 ┃ ┃1 │2 │3 ┃

┠─┼─┼─┨ ┠─┼─┼─┨

┃1 │6 │4 ┃ ----> ┃8 │0 │4 ┃

┠─┼─┼─┨ ┠─┼─┼─┨

┃7 │0 │5 ┃ ┃7 │6 │5 ┃

┗━┷━┷━┛ ┗━┷━┷━┛

初始状态 目标状态

以左图为初始状态,右图为目标状态,请找出从初始状态到目标状态的滑牌移步序

列,具体要求:

(1)输入初始状态和目标状态的数据;

a、分别用两行输入上述两项数据:

b、对输入数据应有查错和示错功能;

(2)实现从初始状态到目标状态的转换(如不能实现,程序应输出不能实现

的提示信息);

(3)输出结果,每移动一步都必须在屏幕上显示:

a、移动每一步时的序号,最后一步的序号即为移动总步数;

b、每一步移动后以3*3表格形式显示状态。

(4)要求能使移动步数尽可能少;



program lxw020;

uses crt;

type a33=array [1..3,1..3] of byte;

a4=array [1..4] of shortint;

node=record

ch:a33;

si,sj,pnt,dep:byte;

end;

const goal:a33=((1,2,3),(8,0,4),(7,6,5));

start:a33=((2,8,3),(1,6,4),(7,0,5));

di:a4=(0,-1,0,1);

dj:a4=(-1,0,1,0);

var data: array [1..100] of node;

temp:node;

k,r,ni,nj,closed,open,depth:integer;

function check(k:integer):boolean;

begin

check:=false;

ni:=temp.si+di[k]; nj:=temp.sj+dj[k];

if(ni in[1..3])and(nj in[1..3]) then check:=true;

if(ni=data[temp.pnt].si)and(nj=data[temp.pnt].sj)

then check:=false;

end;

function dupe:boolean;

var i,j,k: integer;

buf:boolean;

begin

buf:=false; i:=0;

repeat

inc(i); buf:=true;

for j:=1 to 3 do

for k:=1 to 3 do

if data[i].ch[j,k]<>data[open].ch[j,k]

then buf:=false;

until buf or (i>=open-1);

dupe:=buf;

end;

function goals:boolean;

var i,j:integer;

begin

goals:=true;

for i:=1 to 3 do

for j:=1 to 3 do

if data[open].ch[i,j]<>goal[i,j]

then goals:=false;

end;

procedure print;

var buf: array [1..100] of integer;

i,j,k,n:integer;

begin

n:=1; i:=open; buf[1]:=i;

repeat

j:=data[i].pnt;

inc(n); buf[n]:=j; i:=j;

until i=0;

writeln('steps:',depth-1);

for i:=1 to 3 do

begin

for k:=n-1 downto 1 do

begin

for j:=1 to 3 do

write(data[buf[k]].ch[i,j]);

if i=2 then write('->') else write(' ');

end;

writeln;

end;

readln; halt;

end;

begin{main}

closed:=0; open:=1;

with data[1] do

begin

ch:=start; si:=3; sj:=2;

pnt:=0; dep:=0;

end;

repeat

inc(closed); temp:=data[closed];

depth:=temp.dep;

for r:=1 to 4 do

if check(r) then

begin

inc(open);

data[open]:=temp;

with data[open] do

begin

ch[si,sj]:=ch[ni,nj];

ch[ni,nj]:=0; si:=ni; sj:=nj;

pnt:=closed; dep:=depth+1;

end;

if dupe then dec(open)

else if goals then print;

end;

until closed>=open;

writeln('no solution!'); readln

end.

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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