LQ0107 剪邮票置换+DFS

Posted 海岛Blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LQ0107 剪邮票置换+DFS相关的知识,希望对你有一定的参考价值。

题目来源:蓝桥杯2016初赛 C++ A组C题

题目描述
如下图, 有12张连在一起的12生肖的邮票。现在你要从中剪下5张来,要求必须是连着的。(仅仅连接一个角不算相连)

比如,下面两张图中,粉红色所示部分就是合格的剪取。

请你计算,一共有多少种不同的剪取方法。

输出格式
请填写表示方案数目的整数。

问题分析
用7个0和5个1填入3*4的格中,共有752种不同的填法。
对于这些填法,再用DFS算一下连通块数量即可。

AC的C++语言程序如下:

/* LQ0107 剪邮票 */

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

const int R = 3, C = 4, N = 5;

int a[R][C];
int p[] = 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1;

int dfs(int r, int c)

    if (r < 0 || r >= R || c < 0 || c >= C)
        return 0;
    if (a[r][c] != 1) return 0;
    int ans = 1;
    a[r][c] = 0;
    ans += dfs(r - 1, c);
    ans += dfs(r + 1, c);
    ans += dfs(r, c - 1);
    ans += dfs(r, c + 1);
    return ans;


int main()

    int cnt = 0;
    do 
        memcpy(&a[0][0], p, sizeof p);

        for (int i = 0; i < R; i++)
            for (int j = 0; j < C; j++)
                if (a[i][j] && dfs(i, j) == N) 
                        cnt++;
                        i = R;
                        break;
                
     while (next_permutation(p, p + 12));

    cout << cnt << endl;

    return 0;

以上是关于LQ0107 剪邮票置换+DFS的主要内容,如果未能解决你的问题,请参考以下文章

剪邮票

剪邮票dfs+bfs+组合+结构体

剪邮票

蓝桥杯剪邮票

16年第七届蓝桥杯第七题_剪邮票

java算法 第七届 蓝桥杯B组(题+答案) 7.剪邮票