标题:请问这道题的输出怎么按字典序排列?
只看楼主
青蝶
Rank: 2
等 级:论坛游民
帖 子:160
专家分:51
注 册:2018-2-4
结帖率:92%
已结贴  问题点数:20 回复次数:18 
请问这道题的输出怎么按字典序排列?
在a这个整型数组里有10个元素,大小为1,2或者3,下标从1到10。现在给出一个数,输出满足a中10个数之和为这个数的所有情况,按字典序输出。
没有满足条件的情况则输出0。

我的程序可以输出所有结果,但不是按字典序,想问一下应该怎么改?

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

int a[11],s[10000][11],k=0;


void dfs(int x,int remain){
    int i;
    if(x==0){
      if(remain!=0)
        return;
    }
    if(remain==0){
        for(i=1;i<=10;i++) s[k][i]=a[i];
        k++;
        return;
    }   
    if(a[x]==2){
        a[x]=3;
        dfs(x-1,remain-1);
        a[x]=2;
        dfs(x-1,remain);
    }
    if(a[x]==1){
        a[x]=2;
        dfs(x,remain-1);
        a[x]=1;
        dfs(x-1,remain);
    }
}
   
int main(void){
    int n,i,j;
    scanf("%d",&n);
    if(n<10 || n>30){
        printf("0\n");
        exit(0);
    }
    for(i=0;i<11;i++) a[i]=1;
    dfs(10,n-10);
    printf("%d\n",k);
    for(i=0;i<k;i++){
      for(j=1;j<=9;j++){
          printf("%d ",s[i][j]);
    }
      printf("%d\n",s[i][10]);
}
    return 0;
}
   
搜索更多相关主题的帖子: 输出 字典 int for printf 
2018-06-20 22:41
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
得分:4 
最简单的是
10位三进制

https://zh.
2018-06-20 23:13
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
得分:0 
程序代码:
#include <stdio.h>

void print(int* arr)
{
    for(int i=0; i<10; ++i)
    {
        printf("%4d", arr[i]+1);
    }
    puts("");
}

int checkNum(int n, int m)
{
    int sum = 0;
    int index = 10;
    int arr[10] = {0};
    while(n)
    {
        sum += n%3+1;
        arr[--index] = n%3;
        n /= 3;
    }    
    if(sum + index == m)
    {
        print(arr);
        return 1;
    }
    return 0;
}

int main(int argc, char *argv[])
{
    int n;
    scanf("%d", &n);
    int bfind = 0;
    for(int i=0; i<9*9*9*9*9; ++i)
    {
        if(checkNum(i, n))
            bfind = 1;
    }
    
    if(bfind == 0)
    {
        puts("0");
    }
    return 0;
}


https://zh.
2018-06-21 00:24
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:705
专家分:2043
注 册:2010-11-11
得分:4 
我觉得你应该去C++版块
2018-06-21 01:37
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
得分:4 
@青蝶     ,。
举个例子。数组【2,1,1,3,1,2】,输出和是3 的组合,顺序应如下:
2+1  2+1  2+1  1+1+1  1+2  1+2  3  1+2

这道题我认为不需要用到矩阵。题目之所以规定要求你按照字典序,主要还是希望你用递归迭代的方法来做
程序代码:
int KeySum;//指示要匹配的“和”
int a[10];
int func(int n,int sum){//n指示目前所找到的位置,sum指示已累计的和
for(int i=n+1;i<10;i++){
if(sum+a[i]==KeySum){print();//如何输出找到的组合可能需要引入额外的缓存数组,时间缘故我不展开}
else if(sum+a[i]<KeySum){func(i,sum+a[i]);}   }
return状态;//指示是否找到可行的组合方案
}
main(){if(func(-1,0)==没找到){printf("0");}}

赶着上班去,就只给思路了。

φ(゜▽゜*)♪
2018-06-21 07:00
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
得分:0 
回复 5楼 书生牛犊
题目理解错了
10个数之和为这个数
10个元素都要加起来
不是选择一两个元素加起来

https://zh.
2018-06-21 09:29
星泪成寒
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:6
帖 子:75
专家分:539
注 册:2013-5-19
得分:4 
题目看不懂啊!!!
10个数加起来等于给定的数, 哪里来的多种情况?
2018-06-21 09:50
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
得分:0 
回复 7楼 星泪成寒
比如给定 12
可以是
1 1 1 1 1 1 1 1 1 3
1 1 1 1 1 1 1 1 2 2
这就是多种情况了

https://zh.
2018-06-21 10:07
青蝶
Rank: 2
等 级:论坛游民
帖 子:160
专家分:51
注 册:2018-2-4
得分:0 
回复 5楼 书生牛犊
不好意思,题目描述地不是很清楚,就是6楼大佬的意思
2018-06-21 16:58
青蝶
Rank: 2
等 级:论坛游民
帖 子:160
专家分:51
注 册:2018-2-4
得分:0 
我改成字符数组存储了,把所有结果存起来以后按字典序排序,用的strcmp函数,但是输出没变,怎么回事?
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;

int a[11],k=0;

struct str{
    char s[12];
}s0[10000];


void dfs(int x,int remain){
    int i;
    if(x==0){
      if(remain!=0)
        return;
    }
    if(remain==0){
        for(i=1;i<=10;i++) s0[k].s[i]=a[i]+'0';
        k++;
        return;
    }   
    if(a[x]==1){
        a[x]=2;
        dfs(x,remain-1);
        a[x]=1;
        dfs(x-1,remain);
    }
    if(a[x]==2){
        a[x]=3;
        dfs(x-1,remain-1);
        a[x]=2;
        dfs(x-1,remain);
    }
}

int main(void){
    int n,i,j,t;
    struct str temp;
    scanf("%d",&n);
    if(n<10 || n>30){
        printf("0\n");
        exit(0);
    }
    for(i=0;i<11;i++) a[i]=1;
    dfs(10,n-10);
    printf("%d\n",k);
    for(i=0;i<k-1;i++){            //按字典序排序
        t=i;
        for(j=i+1;j<k;j++){
            if(strcmp(s0[t].s,s0[j].s)) t=j;
        }
        if(t!=i){
            temp=s0[i];
            s0[i]=s0[t];
            s0[t]=temp;
        }
    }
    for(i=0;i<k;i++){
      for(j=1;j<=9;j++){
          printf("%c ",s0[i].s[j]);
    }
      printf("%c\n",s0[i].s[10]);
}
    return 0;
}


[此贴子已经被作者于2018-6-21 17:11编辑过]

2018-06-21 17:09



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-488044-1-1.html




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

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