hpuoj 1005: C语言考试练习题_排列【dfs】

这是一道C语言考试练习题,要求用四个不同的数字生成所有不重复的三数排列。通过深度优先搜索(DFS)方法解决,但需要注意输出格式的特殊处理,以避免标准全排列格式。
摘要由CSDN通过智能技术生成

C语言考试练习题_排列

题目描述

有4个互不相同的数字,输出由其中三个不重复数字组成的排列。

输入

4个整数。

输出

所有排列。

样例输入

1 2 3 4

样例输出

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
1 2 4
1 4 2
2 1 4
2 4 1
4 1 2
4 2 1
1 3 4
1 4 3
3 1 4
3 4 1
4 1 3
4 3 1
2 3 4
2 4 3
3 2 4
3 4 2
4 2 3
4 3 2


本来是不打算贴上来的,感觉自己做的太水了,但是觉得这个题还是很好的,虽然打的是全排列,但是输出的格式不是正常的格式,这样需要在深搜之前先处理一下,比如改变里面的值,反正,我现在还没想到不多次使用 dfs 怎么处理这个问题.......


#include<stdio.h> 
#include<string.h> 
int vis[5],x[10],y[10],s[10]; 
void dfs(int v) 
{ 
    if(v==3) //控制个数
    { 
        int i; 
        for(i=0;i<2;++i) //输出控制
        { 
            printf("%d ",x[i]); 
        } 
        printf("%d\n",x[i]); //注意格式
        return; 
    } 
    for(int i=0;i<3;++i) //循环保存数组里的数据.
    { 
        if(!vis[i]) 
        { 
            vis[i]=1; 
            x[v]=s[i]; 
            dfs(v+1); 
            vis[i]=0; 
        } 
    } 
} 
int main() 
{ 
    int i,j,k; 
    while(~scanf("%d",&y[0])) 
    { 
        for(i=1;i<4;++i) 
        { 
            scanf("%d",&y[i]); 
        } 
        k=4; 
        while(k--) 
        { 
            for(i=0,j=0;j<3;++i) //改变需要处理的数组内部的值
            { 
                if(i!=k) 
                { 
                    s[j++]=y[i]; 
                } 
            } 
            dfs(0); //打印全排列
        } 
        printf("\n"); 
    } 
    return 0; 
}  
/************************************************************** 
    Problem: 1005 
    User: 311409010319 
    Language: C++ 
    Result: 正确 
    Time:0 ms 
    Memory:816 kb 
****************************************************************/ 






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值