| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 400 人关注过本帖
标题:八数码程序运行不对
只看楼主 加入收藏
ltx151604740
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2010-10-19
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:6 
八数码程序运行不对
是我写的一个用A算法解八数码的问题,编译通过了,但运行有些结果不对,麻烦各位大侠帮我找一下错
#include<stdio.h>
int E=0;
int B[9]={1,2,3,8,0,4,7,6,5};//目标状态

void produce(int a[200][14],int i,int j);
void sort(int a[200][14],int i);
void output(int a[200][14],int j);


main(){
  int N=0,c;
  int A[200][14]={{2,8,3,1,0,4,7,6,5,0,3,3,4,5}};//初始状态
  for(;A[N][10];){//A[N][10]存的是好h(n)值,当为0时循环结束
  c=A[N][12];//A[N][12]存的是零的位置
  produce(A,N,c);//产生节点
  N++;
  sort(A,N);//排列节点,下一个节点保持是F(N)最小的节点
 }
 output(A,N);
}

 


void produce(int a[200][14],int i,int j){
    int p,q;
 //up
 if((j>2)&&(a[i][13]!=1)){
  E++;
  for(p=0;p<=8;p++){a[E][p]=a[i][p];}
  a[E][j-3]=0;
  a[E][j]=a[i][j-3];
  a[E][9]=a[i][9]+1;//当前节点的深度
  p=0;q=0;
  for(;p<=8;p++){
   if((a[E][p]!=B[p])&&(a[E][p]!=0)){
    q++;}
  }
  a[E][10]=q;//h(n)的值
  a[E][11]=a[E][9]+a[E][10];//f(n)的值
  a[E][12]=j-3;//0的位置
  a[E][13]=0;//该节点是由上移得到的,0代表上,1代表下,2代表左,3代表右
 }
//down
 if((j<=5)&&(a[i][13]!=0)){
  E++;
  for(p=0;p<=8;p++){a[E][p]=a[i][p];}
  a[E][j+3]=0;
  a[E][j]=a[i][j+3];
  a[E][9]=a[i][9]+1;
  p=0;q=0;
  for(;p<=8;p++){if((a[E][p]!=B[p])&&(a[E][p]!=0)){q++;}}
  a[E][10]=q;
  a[E][11]=a[E][9]+a[E][10];
  a[E][12]=j+3;
  a[E][13]=1;
 //left
 if((j!=0)&&(j!=3)&&(j!=6)&&(a[i][13]!=3)){
  E++;
  for(p=0;p<=8;p++){a[E][p]=a[i][p];}
  a[E][j-1]=0;
  a[E][j]=a[i][j-1];
  a[E][9]=a[i][9]+1;
  p=0;q=0;
  for(;p<=8;p++){if((a[E][p]!=B[p])&&(a[E][p]!=0)){q++;}}
  a[E][10]=q;
  a[E][11]=a[E][9]+a[E][10];
  a[E][12]=j-1;
  a[E][13]=2;
 }
 //right
 if((j!=2)&&(j!=5)&&(j!=8)&&(a[i][13]!=2)){
  E++;
  for(p=0;p<=8;p++){a[E][p]=a[i][p];}
  a[E][j+1]=0;
  a[E][j]=a[i][j+1];
  a[E][9]=a[i][9]+1;
  p=0;q=0;
  for(;p<=8;p++){if((a[E][p]!=B[p])&&(a[E][p]!=0)){q++;}}
  a[E][10]=q;
  a[E][11]=a[E][9]+a[E][10];
  a[E][12]=j+1;
  a[E][13]=3;
}
}
}


void sort(int a[200][14],int i){
  int j=i;
  int t,x;
  int min=a[i][11];
  for(i=i+1;i<=E;i++){
   if(a[i][11]<=min){
    for(x=0;x<=13;x++){
     t=a[j][x];
        a[j][x]=a[i][x];
     a[i][x]=t;}}
  }
}
  




void output(int a[20][14],int j){
 int p,q;
 for(p=0;p<=j;p++){
  for(q=0;q<=8;q++){
     printf("%d %d %d",a[p][q],a[p][q+1],a[p][q+2]);
     printf("\n");
     q=q+2;}
 printf("\n");
    printf("\n");
 }
}
搜索更多相关主题的帖子: 数码 运行 
2010-10-19 12:36
ltx151604740
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2010-10-19
收藏
得分:0 
那位大侠有空帮我一下呀
2010-10-19 16:18
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:1 
#include <stdio.h>
#include <string.h>
int fac[10]={1,1};
int hash[362880];
struct Node
{
 int s[9],step,pos;
 int hashval()
 {
  int ret=0,i,j,tmp;
  int flag[9];
  memset(flag,0,sizeof(flag));
  for(i=0;i<8;i++)
  {
   tmp=0;
   for(j=0;j<s[i];j++)
    if(!flag[j])
     tmp++;
   ret+=tmp*fac[8-i];
   flag[s[i]]=1;
  }
  return ret;
 }
 int up()
 {
  if(pos<=2)return 0;
  s[pos]^=s[pos-3];
  s[pos-3]^=s[pos];
  s[pos]^=s[pos-3];
  pos-=3;
  return 1;
 }
 int down()
 {
  if(pos>=6)return 0;
  s[pos]^=s[pos+3];
  s[pos+3]^=s[pos];
  s[pos]^=s[pos+3];
  pos+=3;
  return 1;
 }
 int left()
 {
  if(pos==0||pos==3||pos==6)return 0;
  s[pos]^=s[pos-1];
  s[pos-1]^=s[pos];
  s[pos]^=s[pos-1];
  pos--;
  return 1;
 }
 int right()
 {
  if(pos==2||pos==5||pos==8)return 0;
  s[pos]^=s[pos+1];
  s[pos+1]^=s[pos];
  s[pos]^=s[pos+1];
  pos++;
  return 1;
 }
 int EQ(const Node&x)
 {
  int i;
  for(i=0;i<9;i++)if(s[i]!=x.s[i])return 0;
  return 1;
 }
}Q[362880],S,A,B,tmp,top;
void mkfac(){int i;for(i=2;i<=9;i++)fac[i]=fac[i-1]*i;}
int main()
{
 char buf[101];
 int i,t,l,r;
 int flag;
 mkfac();
 while(scanf("%d",&A.s[0])!=EOF)
 {
  t=0;
  if(A.s[0]==0)A.pos=0;
  for(i=1;i<=8;i++){scanf("%d",&A.s[i]);if(A.s[i]==0)A.pos=i;}
  for(i=0;i<=8;++i)
  {
   scanf("%d",&B.s[i]);
   if(B.s[i]==0)B.pos=i;
  }
  l=r=0;
  flag=0;
  memset(hash,0,sizeof(hash));
  S=A;
  S.step=0;
  Q[r++]=S;
  while(l<=r)
  {
   top=Q[l++];
   top.step++;
   //up...
   tmp=top;
   if(tmp.up())
   {
    if(!hash[t=tmp.hashval()])
    {
     if(tmp.EQ(B)){printf("%d\n",tmp.step);flag=1;goto AA;}
     hash[t]=1;
     Q[r++]=tmp;
    }
   }
   //down...
   tmp=top;
   if(tmp.down())
   {
    if(!hash[t=tmp.hashval()])
    {
     if(tmp.EQ(B)){printf("%d\n",tmp.step);flag=1;goto AA;}
     hash[t]=1;
     Q[r++]=tmp;
    }
   }
   //left...
   tmp=top;
   if(tmp.left())
   {
    if(!hash[t=tmp.hashval()])
    {
     if(tmp.EQ(B)){printf("%d\n",tmp.step);flag=1;goto AA;}
     hash[t]=1;
     Q[r++]=tmp;
    }
   }
   //right...
   tmp=top;
   if(tmp.right())
   {
    if(!hash[t=tmp.hashval()])
    {
     if(tmp.EQ(B)){printf("%d\n",tmp.step);flag=1;goto AA;}
     hash[t]=1;
     Q[r++]=tmp;
    }
   }
  }
AA:;
   if(!flag)
    puts("-1");
 }
    return 0;
}

 4

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-10-19 19:05
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:1 
明显这两个算法有出入。
2010-10-20 00:01
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:2 
这么长的代码,楼主可能很难等到有人有耐心帮你细看,很耗时的。

自己能写这么长的代码,应该也算是实力不俗了,难道自己调试不出吗?追踪自己的代码,比我们从头看要轻松不少呢。
2010-10-20 00:02
逐渐学习
Rank: 6Rank: 6
等 级:侠之大者
帖 子:113
专家分:454
注 册:2010-9-26
收藏
得分:16 
楼主出现两个错误:
一、在计算down时候,结尾大括号出现问题,你把它放到left 和right 后面了。
//down
if((j<=5)&&(a[i][13]!=0)){
  E++;
  for(p=0;p<=8;p++){a[E][p]=a[i][p];}
  a[E][j+3]=0;
  a[E][j]=a[i][j+3];
  a[E][9]=a[i][9]+1;
  p=0;q=0;
  for(;p<=8;p++){if((a[E][p]!=B[p])&&(a[E][p]!=0)){q++;}}
  a[E][10]=q;
  a[E][11]=a[E][9]+a[E][10];
  a[E][12]=j+3;
  a[E][13]=1;
}
二、在计算sort时候,应该是a[i][11]<min而不是a[i][11]<=min
void sort(int a[200][14],int i){
  int j=i;
  int t,x;
  int min=a[i][11];
  for(i=i+1;i<=E;i++){
   if(a[i][11]<min
){
    for(x=0;x<=13;x++){
     t=a[j][x];
        a[j][x]=a[i][x];
     a[i][x]=t;}}
  }
}

[ 本帖最后由 逐渐学习 于 2010-10-22 15:45 编辑 ]

帮人《---》帮己
2010-10-22 15:43
ltx151604740
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2010-10-19
收藏
得分:0 
回复 6楼 逐渐学习
六楼,太感谢你了,大侠,难得你这么仔细帮我看。
2010-10-24 00:29
快速回复:八数码程序运行不对
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030019 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved