| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 592 人关注过本帖
标题:一个排序问题求解
只看楼主 加入收藏
王思源
Rank: 1
等 级:新手上路
帖 子:33
专家分:1
注 册:2012-9-16
结帖率:60%
收藏
已结贴  问题点数:20 回复次数:7 
一个排序问题求解
全班同学排成 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 啊

   
2012-10-08 22:59
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分: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;
}

重剑无锋,大巧不工
2012-10-09 01:23
王思源
Rank: 1
等 级:新手上路
帖 子:33
专家分:1
注 册:2012-9-16
收藏
得分:0 
回复 楼主 王思源
感觉好复杂。。。。。有简单点的方法吗?
2012-10-09 20:46
王思源
Rank: 1
等 级:新手上路
帖 子:33
专家分:1
注 册:2012-9-16
收藏
得分:0 
回复 楼上
我们还没学过 search呢
2012-10-09 20:47
遗矢的老人
Rank: 9Rank: 9Rank: 9
来 自:成都
等 级:蜘蛛侠
威 望:7
帖 子:325
专家分:1131
注 册:2012-7-20
收藏
得分:0 
回复 4楼 王思源
呵呵  search不用学
2012-10-09 21:03
易780
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2012-10-9
收藏
得分:0 
回复 4楼 王思源
太复杂
2012-10-09 21:06
heishu
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:42
专家分:131
注 册:2012-9-7
收藏
得分:10 
看了一下,我就稍微地解释一下吧!如果不对请高手指正:

第一个函数是判断是否是规定的输出顺序;
第二个函数是用于输出结果;
第三个函数:
程序代码:
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;
    }
}

第四个就不说了
楼主并没说每排有多少人;f所在的位置可能是第一排的第1,2,3。。。。。。。。。n个
其它的一样,
也就是说题目没对f所在的列没有约束,其它也一样
那么输出顺序为feabcd的就有好多种;(因为它们列的位置不同)
比如f在第一排的第二列;
e在第二排的3列
a在第三排的第一列
b在第四排的1列
c在第五排的1列
d在第六排的1列


看来要有人来给楼主解释代码

[ 本帖最后由 heishu 于 2012-10-9 21:45 编辑 ]

[qq]1402050187[/qq]
2012-10-09 21:19
王思源
Rank: 1
等 级:新手上路
帖 子:33
专家分:1
注 册:2012-9-16
收藏
得分:0 
算了 我放弃了 还是等我多看点书在说吧 谢谢了啊
2012-10-09 23:21
快速回复:一个排序问题求解
数据加载中...
 
   



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

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