1-12十二个数字分别填入3*4的十二格方框内,要求从左至右的数字是从小到大排列,从上至下的数字也是从小到大排列,问:一共有多少种排列方式。
思路是写程序暴力,1一定在左上,12一定在右下暴力2~11即可,共10!
#include <bits/stdc++.h>
using namespace std;
int main(void) {
int a[13];
for (int i = 0; i < 13; i++) a[i] = i;
int sum=0;
do {
if(a[1] > a[2] || a[2] > a[3] || a[3] > a[4])continue;
if(a[5] > a[6] || a[6] > a[7] ||a[7] > a[8])continue;
if(a[9] > a[10] ||a[10] > a[11]|| a[11] > a[12])continue;
if(a[1] > a[5] || a[5] > a[9] )continue;
if(a[2] > a[6] || a[6] > a[10])continue;
if(a[3] > a[7] || a[7] > a[11])continue;
if(a[4] > a[8] || a[8] > a[12])continue;
sum++;
} while (next_permutation(a + 2, a + 12));
cout << sum << endl;
return 0;
}
自己练习写下dfs也行。
#include <bits/stdc++.h>
using namespace std;
int a[13];
int v[13];
int sum = 0;
void dfs(int k) {
if(k == 12) {
if(a[1] > a[2] || a[2] > a[3] || a[3] > a[4])return;
if(a[5] > a[6] || a[6] > a[7] ||a[7] > a[8])return;
if(a[9] > a[10] ||a[10] > a[11]|| a[11] > a[12])return;
if(a[1] > a[5] || a[5] > a[9] )return;
if(a[2] > a[6] || a[6] > a[10])return;
if(a[3] > a[7] || a[7] > a[11])return;
if(a[4] > a[8] || a[8] > a[12])return;
sum++;
return;
}
for(int i = 2; i <= 11; i++) {
if(v[i] == 0) {
a[k] = i;
v[i] = 1;
dfs(k + 1);
v[i]= 0;
}
}
}
int main(void) {
a[1] = 1;
a[12] =12;
dfs(2);
cout << sum << endl;
return 0;
}