| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 427 人关注过本帖
标题:好程序值得继续讨论学习。
只看楼主 加入收藏
qunxingw
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:24
帖 子:1676
专家分:7295
注 册:2011-6-30
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:5 
好程序值得继续讨论学习。
一个排序问题求解
全班同学排成 6 排, A 、 B 、 C 、 D 、 E 、 F 等 6 人分别站在第 1 排到第 6 排 • 用 6 个 int 变量表示 A — F 的位置 –

A 不在第 1 排 à a != 1

A 与 B 前后相邻  (a == b + 1) || (a == b - 1)

C 在 D 前面 c == d - 1

E 在 B 的前两排  e == b - 2  

C 在 F 后的第 4 排  c == f + 4

怎么让输出结果是f e a b c d 啊

   

 前天 22:59   
举报帖子
使用道具
我来评分
 beyondyf

等 级:版主
威 望:30
帖 子:1907
专家分:6828
注 册:2008-1-21
第 2 楼   得分:10      很晚了,就不解释代码了,自己揣摩一下。


程序代码:
#include <stdio.h>

#define ROW_LEN        6

int judge(int * r)
{
    if(r[0] != 1)
    if(r[0] == r[1] + 1 || r[0] == r[1] - 1)
    if(r[2] == r[3] - 1)
    if(r[4] == r[1] - 2)
    if(r[2] == r[5] + 4)
        return 1;
    return 0;
}

void print_row(int * r)
{
    int i;
    char p[ROW_LEN + 1];
    for(p[ROW_LEN] = '\0', i = 0; i < ROW_LEN; i++) p[r[i] - 1] = i + 'a';
    puts(p);
}

void search(int * r, int deep)
{
    int i, j, t;
    if(deep == ROW_LEN && judge(r))
    {
        print_row(r);
        return;
    }
    for(i = deep; i < ROW_LEN; i++)
    for(j = i; j < ROW_LEN; j++)
    {
        t = r[i]; r[i] = r[j]; r[j] = t;
        search(r, deep + 1);
        t = r[i]; r[i] = r[j]; r[j] = t;
    }
}

int main()
{
    int r[] = {1, 2, 3, 4, 5, 6};
    search(r, 0);
    return 0;
版主的程序很是精妙,应该好好学习。本人大把年纪人业余学习,学生们更应努力。
我研究了好一会,从入门者思维出发,改了一下,希望入门的朋友能有收获。
程序代码:
#include <stdio.h>

#define ROW_LEN        6

int judge(char * p)
{
    if(p[0]!='a')
   if(p[0] == p[1] + 1 || p[0] == p[1] - 1)
    if(p[2] == p[3] - 1)
    if(p[4] == p[1] - 2)
    if(p[2] == p[5] + 4)
        return 1;
    return 0;
}

void print_row(char * p)
{
    int i;
    char r[ROW_LEN+1 ];
    for(p[ROW_LEN] = '\0', i = 0; i < ROW_LEN; i++) p[i];//printf("%c",p[i]);
 puts(p);
}

void search(char * p, int deep)
{
    int i, j, t;
    if(deep == ROW_LEN && judge(p))
    {
        print_row(p);
        return;
    }
    for(i = deep; i < ROW_LEN; i++)
    for(j = i; j < ROW_LEN; j++)
    {
        t = p[i]; p[i] = p[j]; p[j] = t;
        search(p, deep + 1);
        t = p[i]; p[i] = p[j]; p[j] = t;
    }
}

int main()
{
    char r[] = {'a', 'b', 'c','d', 'e', 'f'};
    search(r, 0);
    getchar();
    return 0;
}
搜索更多相关主题的帖子: 道具 
2012-10-10 16:07
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:20 
呵呵,没改成功啊。还得继续。

既然你打算用r的值来表示学生(我是用r的索引表示),那就不能套用我的judge函数了。

虽然你改了judge函数中第一个判断条件,但其它的没改不行。

你的代码执行过了么?

以上不是批评,只是提醒。喜欢楼主的钻研精神。冒昧的问一句,楼主多大了?

重剑无锋,大巧不工
2012-10-10 16:41
qunxingw
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:24
帖 子:1676
专家分:7295
注 册:2011-6-30
收藏
得分:0 
精碎没动,就象某国拿了美的F22样品,没到独立开发的阶段。感觉这样初学者好理解点。本人70年代初

www.qunxingw.wang
2012-10-10 16:47
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
呵呵,不能这么改的。程序这东西,环环相扣,牵一发而动全身,失之毫厘,谬以千里。

初学者容易理解的大概是下面这样的代码,虽然直白,但其可扩展性及效率都很差。对比着看一下吧。
程序代码:
#include <stdio.h>

int main()
{
     int a, b, c, d, e, f, i;
     char list[7] = {0};
     for(a = 1; a <= 6; a++)
         for(b = 1; b <= 6; b++)
         {
            if(b == a) continue;
            for(c = 1; c <= 6; c++)
            {
                if(c == a || c == b) continue;
                for(d = 1; d <= 6; d++)
                {
                    if(d == a || d == b || d == c) continue;
                    for(e = 1; e <= 6; e++)
                    {
                        if(e == a || e == b || e == c || e == d) continue;
                        for(f = 1; f < 6; f++)
                        {
                            if(f == a || f == b || f == c || f == d || f == e) continue;
                           
                            if(a != 1)
                            if(a == b + 1 || a == b - 1)
                            if(c == d - 1)
                            if(e == b - 2)
                            if(c == f + 4)
                            {
                                list[a - 1] = 'a';
                                list[b - 1] = 'b';
                                list[c - 1] = 'c';
                                list[d - 1] = 'd';
                                list[e - 1] = 'e';
                                list[f - 1] = 'f';
                                puts(list);
        }    }    }    }    }    }
     return 0;
}

重剑无锋,大巧不工
2012-10-10 17:20
qunxingw
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:24
帖 子:1676
专家分:7295
注 册:2011-6-30
收藏
得分:0 
呵呵,这到是,受教了。

www.qunxingw.wang
2012-10-10 17:39
我爱学习C
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2012-10-10
收藏
得分:0 
都好厉害啊!
2012-10-10 19:39
快速回复:好程序值得继续讨论学习。
数据加载中...
 
   



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

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