题目:
如【图1.jpg】, 有12张连在一起的12生肖的邮票。
现在你要从中剪下5张来,要求必须是连着的。 (仅仅连接一个角不算相连)
比如,【图2.jpg】,【图3.jpg】中,粉红色所示部分就是合格的剪取。
思路:
先暴力选取5个点,然后判断点是否连通。
#include<iostream>
#include<algorithm>
using namespace std;
int cnt;
int a[12] = { 0,0,0,0,0,0,0,1,1,1,1,1};
void dfs(int map[3][4],int x,int y) {
map[x][y] = 0;
if (x - 1 >= 0 && map[x - 1][y] == 1) dfs(map, x - 1, y);
if (x + 1 <= 2 && map[x + 1][y] == 1) dfs(map, x + 1, y);
if (y - 1 >= 0 && map[x][y - 1] == 1) dfs(map, x, y - 1);
if (y + 1 <= 3 && map[x][y + 1] == 1) dfs(map, x, y + 1);
}
bool check() {
int map[3][4];
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
if (a[i * 4 + j] == 1)
map[i][j] = 1;
else
map[i][j] = 0;
}
}//初始化图
int sum=0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
if (map[i][j] == 1) {
dfs(map, i, j);
sum++;
}
}
}
if (sum == 1)
return true;
else
return false;
}
int main() {
do {
if (check())
cnt++;
} while (next_permutation(a, a + 12));
cout << cnt;
return 0;
}