Contents
  1. 1. 剪邮票
  2. 2. 题目:

剪邮票

题目:

如【图1.jpg】, 有12张连在一起的12生肖的邮票。
现在你要从中剪下5张来,要求必须是连着的。
(仅仅连接一个角不算相连)
比如,【图2.jpg】,【图3.jpg】中,粉红色所示部分就是合格的剪取。

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

请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

tu
tu
tu

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;

bool mp[3][4] = {false};

int a[12] = {0};

int dfs(int i, int j)
{

int ans = 1;
mp[i][j] = false;
if(i > 0 && mp[i - 1][j])
ans += dfs(i - 1, j);
if(j > 0 && mp[i][j - 1])
ans += dfs(i, j - 1);
if(i < 2 && mp[i + 1][j])
ans += dfs(i + 1, j);
if(j < 3 && mp[i][j + 1])
ans += dfs(i, j + 1);
return ans;
}

int main()
{

int ans = 0;
for(int i = 11; i > 6; i--)
a[i] = 1; //寻找a[i]等于1的点给mp做上true标记
do{
memset(mp, false, sizeof(mp));
int r = 0, c = 0;
for(int i = 0; i < 12; i++)if(a[i]){
mp[i / 4][i % 4] = true; //[i/4]是行数[i%4]是列数
r = i / 4;
c = i % 4;
}
if(dfs(r, c) == 5)
++ans;
}while(next_permutation(a, a + 12));
printf("%d\n", ans);
return 0;
}
Contents
  1. 1. 剪邮票
  2. 2. 题目: