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的主要内容,如果未能解决你的问题,请参考以下文章