看到有很多用DFS,八皇后,N骑士,还有什么给几个碎片拼正方形的,其实都是在一定数上的组合情况的枚举,好多都是本质上都是一样的,但是经常写的时候还是会卡一下,当个模板吧
比如这个从12个格子里不重不漏地找5个块的组合情况,数量上应该是792
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
//三行四列一共12个元素
const int r = 3, c = 4;
int zuhe;
bool mapp[10][10];
//从12个中选5个的组合方式
//paint当前状态是到(x, y)这个点,不包括(x, y)已经完成了dep个
void paint(int x, int y, int dep) {
if (dep == 5) {
zuhe++;
return;
}
if (x == r) return;
for (int i = y; i <= c; i++) {
if (i < c) {
mapp[x][i] = true;
paint(x, i + 1, dep + 1);
mapp[x][i] = false;
}
else {
paint(x + 1, 0, dep);
}
}
}
int main()
{
memset(mapp, false, sizeof(mapp));
zuhe = 0;
paint(0, 0, 0); //从最左上角开始
cout << zuhe << endl;
return 0;
}