| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2012 人关注过本帖, 1 人收藏
标题:算法练习4~三色棋~
取消只看楼主 加入收藏
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 16楼 九转星河
那个链表代码修改一下不用递归也能做全组合~以前写的~也许写得没有那么严谨~

程序代码:
#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(Node)
int count=0;
#define N 5
typedef struct Node
{
    int num;
    struct Node *next;
    struct Node *back;
}Node;
Node *head=NULL;
Node *back=NULL;
Node *p[5];
void set()
{
    int i=0;
    p[i]=head;

    while (i<N-1)
    {
        p[i+1]=p[i]->next;
        i++;
    }
}
void creat()
{
    Node *p1,*p2;
    int i=0,n=N;

    head=NULL;    

    p1=p2=malloc(LEN);
    p1->back=NULL;
    p1->num=1;

    while (--n)
    {
        if (n==N-1)
            head=p1;
        else
            {
                p2->next=p1;
                p1->back=p2;
            }
        p2=p1;
        p1=malloc(LEN);
        p1->num=N-n+1;
    }
    p2->next=p1;
    p1->back=p2;
    p1->next=NULL;
}
void print()
{
    Node *p=head;
    while (p)
    {
        printf("%d ",p->num);
        p=p->next;
    }
    printf("\n");
}
void print_p(int M)
{
    int i;
    for (i=0;i<M;i++)
        printf("%d ",*p[i]);
    printf("\n");
    count++;
}
void fun_1(int M)
{
    while(p[M-1]->next!=NULL)
    {
        print_p(M);
        p[M-1]=p[M-1]->next;
    }
    print_p(M);
}
int fun_2(int M)
{
    int i=1;

    if (M==1)
        return 0;

    while (p[M-i]->back==p[M-i-1])
        {
            i++;
            if (i==M)
                   return 0;
        }
        p[M-i-1]=p[M-i-1]->next;
     while (i)
    {
        p[M-i]=p[M-i-1]->next;
        i--;
    }
    return 1;
}
void my_free()
{
    Node* p=head;

    if (head==NULL)
        return ;

    while (p->next)
    {
        Node* p2=p;
        p=p->next;
        free(p2);
    }

    free(p);
    head=NULL;
}
int main()
{
    int M=0; 
    printf("NULL\n");

    for (M=1;M<=N;++M)
    {
        creat();
        set();
        do
        {
            fun_1(M);
        }while(fun_2(M));
        my_free();
    }
    printf("\n共有%d种组合\n",count+1);
    return 0;
}

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-15 23:39
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 18楼 xzlxzlxzl
这个和排列组合没有直接关系~我只是通过排列组合引用了汉诺塔的递归结构~说明汉诺塔的递归结构不用递归还是有可能完成的~

PS:其实我是看见13楼x版主说不用递归去弄汉诺塔于是我就敲了16楼的代码~那递归结构和汉诺塔的很类似~然后17楼就用非递归写法实现类似于16楼的功能~就是为了说明不用递归结构也有可能做出来~

[此贴子已经被作者于2017-2-16 09:08编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-16 09:01
快速回复:算法练习4~三色棋~
数据加载中...
 
   



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

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