递归、枚举

1.汉诺塔问题

#include<stdio.h>
void han(int,char,char,char );
int main()
{

    int n;
    char a=‘A‘,b=‘B‘,c=‘C‘;
    scanf("%d",&n);
    han(n,a,b,c);
}
void mov(char a,char b)
{
    printf("%c=>%c\n",a,b);
}
void han(int n,char a,char b,char c)
{
    if(n==1)
        mov(a,c);
    else
    {
        han(n-1,a,c,b);
        mov(a,c);
        han(n-1,b,a,c);
    }
}

2.进制转换问题

输入两个数,一个表示现有的数eg,另一个表示要转换的几进制数ch。用eg模ch,并用一个数组来存即可。

#include<stdio.h>
int main()
{
    int a[10000];
    int eg,ch;
    int i,j;
    scanf("%d%d",&eg,&ch);
    for(i=0; i<10000; i++)
        a[i]=0;
    for(i=0; i<10000; i++)
    {
        a[i]=eg%ch;
        eg=eg/ch;
    }
    for(i=9999; i>-1; i--)
        if(a[i]!=0) break;
    for(j=i; j>-1; j--)
        printf("%d",a[j]);
}

3.八皇后问题

定义一个a[8]数组来存,判断是否满足条件,可用a[j]==i||i-t==a[j]-j||t+i==a[j]+j

示意如下

0 -1 -2 -3 -4 -5 -6 -7
1  0 -1 -2 -3 -4 -5 -6
2  1  0 -1 -2 -3 -4 -5
3  2  1  0 -1 -2 -3 -4
4  3  2  1  0 -1 -2 -3
5  4  3  2  1  0 -1  -2
6  5  4  3  2  1  0  -1
7  6  5  4  3  2  1   0

0  1  2  3  4  5  6  7
1  2  3  4  5  6  7  8
2  3  4  5  6  7  8  9
3  4  5  6  7  8  9 10
4  5  6  7  8  9 10 11
5  6  7  8  9 10 11 12
6  7  8  9 10 11 12 13
7  8  9 10 11 12 13 14

只要判断i-t==a[j]-j和t+i==a[j]+j就可,之后再进行下一列

#include<stdio.h>
int a[8];
int cnt=0;
void et(int a[8],int t)
{
    int i,j;
    if(t==8) cnt++;
    else
    {
        for(i=0; i<8; i++)
        {
            int ok=1;
            a[t]=i;
            for(j=0; j<t; j++)
            {
                if(a[j]==i||i-t==a[j]-j||t+i==a[j]+j)
                {
                    ok=0;
                    break;
                }
            }
            if(ok)
                et(a,t+1);
        }
    }
}
int main()
{
    et(a,0);
    printf("%d",cnt);
}

4.二分查找

按半查找即可

#include<stdio.h>
a[10]={6,8,14,25,36,45,75,85,99,102};
int main()
{
    int er(int t,int up,int down);
    int t,ant;
    scanf("%d",&t);
    ant=er(t,9,0);
    printf("%d",ant);
}
int er(int t,int up,int down)
{
    int m;
    while(up!=down)
    {
        m=down+(up-down)/2;
        if(a[m]==t) return m+1;
        if(a[m]<t)
            down=m+1;
        else
            up=m;
    }
    return -1;
}

5 .枚举排列

按照八皇后的方法来做,如下

a[1000]用来存结果,pl函数内if语句判断是否到边际,else 用来循环1到n并进行回溯。

#include<stdio.h>
int a[1000];
int n;
int main()
{
    void pl(int t,int a[1000]);
    scanf("%d",&n);
    pl(0,a);
}

void pl(int t,int a[1000])
{
    int i,j;
    if(t==n)
    {
        for(i=0;i<n;i++)
            printf("%d",a[i]);
        printf("\n");
    }
    else{
        for(j=1;j<=n;j++)
        {
            int k;
            int ok=1;
            for(k=0;k<t;k++)
            {
                if(a[k]==j) {ok=0;break;}
            }
            if(ok) {a[t]=j;pl(t+1,a);}
        }
    }
}

6,火柴棍问题

直接枚举,先枚举前两个,计算第三个,判断这三个所需的火柴棍数之和加4是否等于n,即可。

#include<stdio.h>
int num[]={6,2,5,5,4,5,6,3,7,6};
int cnt=0;
int de(int d)
{
    int sum=0;
    if(d==0) return 6;
    while(d)
    {
        sum+=num[d%10];
        d=d/10;
    }
    return sum;
}
int main()
{
    int n;
    int i,j;
    scanf("%d",&n);
    for(i=0;i<1000;i++)
    {
        for(j=0;j<1000;j++)
        {
            if(de(i)+de(j)+de(i+j)+4==n)
                cnt++;
        }
    }
    printf("%d",cnt);
}

7

时间: 2025-01-13 10:41:21

递归、枚举的相关文章

Swift枚举-相关值与递归枚举

代码: enum ArithmeticExpression { // 相关值 case Number(Int) // 递归枚举 indirect case Addition(ArithmeticExpression, ArithmeticExpression) indirect case Multiplication(ArithmeticExpression, ArithmeticExpression) indirect case Division(ArithmeticExpression, A

poj1416——dfs递归枚举+记录路径

POJ 1416  dfs递归枚举+记录路径 Shredding Company Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4456   Accepted: 2555 Description You have just been put in charge of developing a new shredder for the Shredding Company Although a "normal" s

poj2531——dfs递归枚举+小剪枝

POJ 2531  dfs递归枚举 Network Saboteur Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9580   Accepted: 4560 Description A university network is composed of N computers. System administrators gathered information on the traffic between nodes

C++ 全排列问题——递归枚举法

全排列问题是一道非常经典的递归题目,而递归枚举法求解也是最暴力的一种方法. 例题 洛谷1706 题目描述 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字. 输入格式 一个整数n. 输出格式 由1-n组成的所有不重复的数字序列,每行一个序列. 每个数字保留 5个场宽. 输入样例 3 输出样例 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 全排列问题--递归枚举法 这是一道经典的递归的题,每次递归枚举第x个数字是几,就是从1到

hdu 5339 递归枚举

只有20个点,从大到小排序然后枚举即可.这里做了一个优化,不模大于自己的数,因为这是徒劳的,我们要求的是最小的r. 注意:不排序就枚举是错误的,想一想,为什么. 1 #include <algorithm> 2 #include <iostream> 3 #include <cstring> 4 #include <cstdio> 5 using namespace std; 6 7 const int INF = 99; 8 const int N = 2

Topcoder SRM 655 DIV1 500 FoldingPaper2 递归 + 枚举

题意:给你一张长W,宽H 的纸,问你能不能者成给定的大小, 每一次折纸只能折成整数大小. 解题思路:递推+枚举   枚举给定大小的长和宽,然后套进 W,H中求最小值  , 折纸策略最优是每次折半. 解题代码: 1 // BEGIN CUT HERE 2 /* 3 4 */ 5 // END CUT HERE 6 #line 7 "FoldingPaper2.cpp" 7 #include <cstdlib> 8 #include <cctype> 9 #incl

uva208递归枚举

#include<cstdio> #include<cstring> int n; int sett[31]; int find2(int x) { return sett[x] = (x==sett[x])?x:find2(sett[x]); } int mapp[25][25]; int B[25]; bool used[25]; int degree=0; void print(int cur,int *B,bool * used,int k) { if(cur == n)

swift_枚举 | 可为空类型 | 枚举关联值 | 枚举递归 | 树的概念

***************可为空的类型 var demo2 :we_demo = nil 上面这个代码串的语法是错的 为什么呢, 在Swift中,所有的类型定义出来的属性的默认值都不可以是nil 不管是普通简单值类型还是引用类型 那我就是要让这个属性默认值为空,为nil 怎么办呢,很简单,用语法,在定义这个属性的时,在类型后面声明一个? 这样就表示这个属性除了指定类型的默认值外还可以是一个可为空的类型 在Java中,最常见的错误类型就是NullPoinExecption, 为什么就是要有Nu

枚举排列的两种常见方法

1.递归枚举 1 #include<iostream> 2 using namespace std; 3 4 void print_permutation(int n, int *p, int cur) 5 { 6 if (cur == n) 7 { 8 for (int i = 0; i < n; i++) 9 cout << p[i]; 10 cout << endl; 11 } 12 else for (int i = 1; i <= n; i++)

进击的雨燕-------------枚举

枚举为一组相关的值定义了一个共同的类型,使你可以在你的代码中以类型安全的方式来使用这些值. 如果你熟悉 C 语言,你会知道在 C 语言中,枚举会为一组整型值分配相关联的名称.Swift 中的枚举更加灵活,不必给每一个枚举成员提供一个值.如果给枚举成员提供一个值(称为“原始”值),则该值的类型可以是字符串,字符,或是一个整型值或浮点数. 此外,枚举成员可以指定任意类型的关联值存储到枚举成员中,就像其他语言中的联合体(unions)和变体(variants).每一个枚举成员都可以有适当类型的关联值.