宫格填数问题(暴力)

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;
}

    原文作者:九宫格问题
    原文地址: https://blog.csdn.net/q3818908/article/details/79338154
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞