题目:
#include<bits/stdc++.h>
using namespace std;
void dfs(int b[][4], int i, int j) { //dfs深搜,将所有连接在一起的全部由1置为0
b[i][j] = 0;
if (i - 1 >= 0 && b[i - 1][j] == 1) dfs(b, i - 1, j);
if (i + 1 <= 2 && b[i + 1][j] == 1) dfs(b, i + 1, j);
if (j - 1 >= 0 && b[i][j - 1] == 1) dfs(b, i, j - 1);
if (j + 1 <= 3 && b[i][j + 1] == 1) dfs(b, i, j + 1);
}
int panduan(int b[][4]) { //判断邮票是否都连在一起,是—返回1
int k = 0;
int i, j;
for (i = 0; i < 3; i++) {
for (j = 0; j < 4; j++) {
if (b[i][j] == 1) {
dfs(b, i, j);
k++;
}
}
}
if (k == 1)
return 1;
else
return 0;
}
int main() {
int a[12] = { 0,0,0,0,0,0,0,1,1,1,1,1 }; //连接在一起的邮票置为1
int b[3][4] = {};
int number = 0;
int k = 0;
do {
int i, j, temp = 0;
for (i = 0; i < 3; i++) { //初始化,将a中转换到二维数组中
for (j = 0; j < 4; j++) {
b[i][j] = a[temp++];
}
}
if (panduan(b) == 1) number++; //判断此种方式剪下来的邮票是否是连着的
} while (next_permutation(a, a + 12)); //5个连接的邮票全排列,随机打在3*4中
cout << number << endl;
return 0;
}
测试结果: