| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2012 人关注过本帖
标题:网上找的分酒问题的代码,但是程序运行不出来,请各位大神帮忙看看!
取消只看楼主 加入收藏
weihuachao
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2017-5-1
结帖率:0
收藏
已结贴  问题点数:20 回复次数:0 
网上找的分酒问题的代码,但是程序运行不出来,请各位大神帮忙看看!
程序代码:
#include<stdio.h>
#include<string.h>
#define N 3   //酒杯数
#define MAX_SIZES 100  //状态表中的最大状态数



 typedef struct node //边节点
 {
    int adjvex;   //邻接点的位置
    node*next;  //指向下一个节点
 }ARCNODE;  //邻接表中的结点类型


 typedef struct   //顶点节点
 {  
    int vexdata[N];        //各酒杯的存储状态
    ARCNODE*next;      //指向下一个邻接点
 }VEXNODE;//表头结点类型
 

 int A[MAX_SIZES];//用于存储路径的数组
 int top=0;//数组中的个数 
 int full[N];//各酒杯的最大容量 
 int part[N];//各酒杯的当前容量 
 int end[N];//最终状态


 VEXNODE s[MAX_SIZES];  //状态表
 int sta;//状态表当前状态数 
  

 int sum=0;//所有解的个数
 int end_vex;//结束的状态点 
 bool visited[MAX_SIZES];//标记状态是否被访问
   
  

 bool compare(int a[],int b[])   //比较状态
  {  
    int i;  
    for(i=0;i<N;i++) 
        if(a[i]!=b[i])  
          return true;//两数组不相等,返回true 
    return false;//相等,返回false 
  } 
  void save(int number)  

 {   //保存状态,如果状态存在则仅仅加入领接表,如果不存在则加入状态表,并加入邻接表
     ARCNODE*p; 
     int i;  
     for(i=0;i<=sta;i++) 
     {  
        if(!compare(part,s[i].vexdata));  
             break;//该状态存在,跳出for循环
     } 
  
     if(i>sta)//将该状态加入状态表
     {  
        sta++; 
        for(int j=0;j<N;j++) 
        s[sta].vexdata[j]=part[j]; 
        s[sta].next=NULL;  
        if(!compare(part,end))  
           end_vex=sta;//该状态是最终状态,记住在状态表中的位置
     } 


     p=new ARCNODE; 
     p->adjvex=i;  
     p->next=s[number].next;  
     s[number].next=p;//加入邻接表
  } 
  

 void jisuan(int number)//求出某状态的所有邻接点
 {  
    int i,j,I,J;  
    for(i=0;i<N;i++)//编号为i的酒杯与其他酒杯交换
    {   
        for(j=0;j<N;j++) 
       {  
            if(j==i)     continue;//同一酒杯,无法变换
            I=part[i];//保存i酒杯的当前的容量
            J=full[j]-part[j];//j酒杯的空闲量
               if(I<=J)//若i酒杯的当前容量小于等于j酒杯的空闲量 
               {  
                part[i]=0;  
                part[j]+=I;//将i酒杯的酒倒向j酒杯  
                save(number);//调用save()函数,保存当前的状态
                part[i]=I;  
                part[j]-=I;//恢复各酒杯的原始状态
               }  
           else//若i酒杯的当前容量大于j酒杯的空闲量
           {  
                part[i]-=J;  
                part[j]=full[j];//把j酒杯加满  
                save(number);//调用save()函数,保存当前的状态
                part[i]+=J;  
                part[j]-=J;//恢复各酒杯的原始状态
           } 
        } 
    } 

 } 

 
  

 void create()//建立状态的函数 
 {  
    int i;
    int number=i; 

 printf("输入各个酒杯的容积:"); 
    for(i=0;i<N;i++)      
     scanf("%d",&full[i]); 

 printf("输入对应酒杯的起始状态:"); 
    for(i=0;i<N;i++)  

 scanf("%d",&s[0].vexdata[i]);//初始状态即状态表中的s[0] 


 printf("输入对应酒杯的最终状态:"); 
    for(i=0;i<N;i++) 
     scanf("%d",&end[i]);//所求的状态
    number=0; sta=0;   
      s[0].next=NULL; 
  
    while(number<=sta) 
    {      
        for(i=0;i<N;i++) 
          part[i]=s[number].vexdata[i];//将s[number]的状态赋给各酒杯当前的容量  
          jisuan(number);//调用jisuan(),求出该状态所有的邻接点
          number++; 
    } 
    
    for(number=0;number<=sta;number++) 
         visited[number]=false; 

 } 
  

 void prtf()   //输出路径 
 {  

 int i,j,k; 

 printf("方案%d:\n",sum);  
    for(i=0;i<top;i++) 
    {  printf(" ");  
        j=A[i];//路径中的位置
        for(k=0;k<N;k++) 
        printf("%d",s[j].vexdata[k]);//输出该状态
    printf(" "); 
   }  

 printf("\n"); 

 } 

 
  

 void dfs(int v0)//深度优先搜索遍历函数 
 {  
  if(!visited[v0])//判断该状态是否被访问过
   {  
        if(v0==end_vex)//判断该状态是否是最终状态
        {  
            sum++;  
           prtf();//调用输出函数
        }  
        else//若不是,深度搜索
        {  
            ARCNODE *p; 
            p=s[v0].next;  
            visited[v0]=true;//标记该状态已访问
           while(p) 
           {  
              A[top++]=p->adjvex;   //记录路径
              dfs(p->adjvex);//递归调用遍历函数
              A[--top];//清空路径
              p=p->next; 
            }  
           visited[v0]=false;//标记该状态未访问,用于其它路径中访问
 
        } 
  } 

 } 
  

 void findpath() 

 {  
    A[top++]=0;         //选择深度所搜遍历的起点
    dfs(0);           //进行深度所搜遍历 
 } 
  

 void  main()  

 {int i,k;  
    create();        //建立模型的状态 
 printf("状态表中的%d中状态:\n",sta+1); 
    for(i=0;i<=sta;i++) 
   {for(k=0;k<N;k++)  
     printf("%d",s[i].vexdata[k]); 
     printf("\t"); 
    }  
    printf("\n共得到如下解法:\n");  
    findpath();              //输出得到的解 
 }
搜索更多相关主题的帖子: 网上 
2017-05-01 09:45
快速回复:网上找的分酒问题的代码,但是程序运行不出来,请各位大神帮忙看看!
数据加载中...
 
   



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

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