PTA——7-110 求符合给定条件的整数集

132 阅读2分钟

给定不超过6的正整数A,考虑从A开始的连续4个数字。请输出所有由它们组成的无重复数字的3位数。

输入格式:

输入在一行中给出A。

输出格式:

输出满足条件的的3位数,要求从小到大,每行6个整数。整数间以空格分隔,但行末不能有多余空格。

输入样例:

2

输出样例:

234 235 243 245 253 254
324 325 342 345 352 354
423 425 432 435 452 453
523 524 532 534 542 543

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

本题思路

用深度优先搜索完成本题,本来想在百度上找一找有没有相关的做法的,结果找了一圈,全是用三、四重循环的。臃肿的一批,于是就自己写了一个版本的dfs,刚学dfs就碰到这题,也算巩固练习吧。

欢迎大佬们指正错误

以下是正确代码

#include<stdio.h>
int a[4];
int book[10];
int n,flag=0;
void dfs(int u,int cnt)
{
    if(cnt==3)//当满三个数时输出
    {
        for(int i=0;i<3;i++)
        {
            printf("%d",a[i]);
        }
        flag++;
        if(flag%6==0){//到第六个就换行
            printf("\n");//没到就输出空格
        }
        else printf(" ");
        return ;//退回上一次搜索的数
    }
    for(int i=n;i<=n+3;i++){
        if(book[i]==0){//cnt表示当前是第几个数
            a[cnt++]=i;//把当前没选过的数存入a数组
            book[i]=1;//将此数在判断数组中划去
            dfs(n+1,cnt);//进行下一个数
            cnt--;//退栈,把数清空,判断数组也清空
            book[i]=0;
        }
    }

}
int main()
{


    scanf("%d",&n);
    int cnt=0;
    for(int i=0;i<n;i++){
        book[i]=2;
    }
   dfs(n,0);//从n和第0个开始搜索
    
    return 0;
}