全排列

往下阅读之前,先回想一下深度搜索的思想是什么。因为全排列的递归实现就是应用了深度搜索。

应用举例

题目1

问题表述
口口口 + 口口口 = 口口口 ,将数字1~9分别填入9个口中,每个数字只能使用一次,并使得等式成立。例如,173 + 286 = 459就是一个合理的组合,请问一共有多少种合理的组合呢?注意:173+286=459与286+173=459是同一种组合。

解析
1、首先列出1~9的所有全排列
2、对于每一个排列,判断一次是否满足 a + b == c ?

/* 全排列的应用举例 1 作者:Zoo 时间:2016年4月19日09:14:33 */
#include <algorithm> // for copy
#include <iostream> // for cout
#include <iterator> // for ostream_iterator

using namespace std;

int book[10] = { 0 };
int res[10];
int sum = 0;

void dfs(int step, int len)
{
    if (step == len)
    {
        int a = res[1] * 100 + res[2] * 10 + res[3];
        int b = res[4] * 100 + res[5] * 10 + res[6];
        int c = res[7] * 100 + res[8] * 10 + res[9];

        if (a + b == c)
        {
            sum++;
            cout << a << " + " << b << " = " << c << endl;
        }
    }

    for (int i = 1; i < len; i++)
    {
        if ( book[i] == 0)
        {
            res[step] = i;  //
            book[i] = 1;

            dfs(step + 1, len);

            book[i] = 0;
        }
    }
}

int main()
{
    dfs(1, 10);

    cout << sum / 2<< endl;
    return 0;
}

结果如下:

你可能感兴趣的:(递归,搜索,全排列,深度搜索)