摆摊地图,二维矩阵,每个格子0或1,,1可摆摊,0不可摆摊,相邻格子不可同时摆摊,问有多少种摆摊方案,结果对987654321取余C++代码及注释
时间: 2023-10-24 19:08:40 浏览: 31
以下是用C++实现的参考代码,注释中有详细的解释:
```c++
#include <iostream>
using namespace std;
const int N = 10;
const int MOD = 987654321;
bool state[N][N]; // 表示地图的状态,1表示可以摆摊,0表示不行
int ans;
void dfs(int x, int y, int cnt) {
if (cnt == N) { // 摆满了N个摊位,得到一种摆摊方案
ans = (ans + 1) % MOD; // 累加方案数并取模
return;
}
if (y >= N) { // 当前行摆满了,转到下一行
x++;
y = 0;
}
if (state[x][y] == 0) { // 当前位置不可摆摊,直接跳过
dfs(x, y+1, cnt);
}
else { // 当前位置可以摆摊
bool flag = true; // 标志当前位置是否可以摆摊
for (int i = -1; i <= 1; i++) { // 枚举当前位置的周围8个位置
for (int j = -1; j <= 1; j++) {
if (i != 0 && j != 0) continue; // 只枚举上下左右四个位置
int nx = x + i, ny = y + j;
if (nx >= 0 && nx < N && ny >= 0 && ny < N && state[nx][ny] == 1) { // 如果周围有摊位已经摆了,当前位置不能摆
flag = false;
break;
}
}
if (!flag) break;
}
if (flag) { // 当前位置可以摆摊
state[x][y] = 0; // 在当前位置摆摊
dfs(x, y+1, cnt-1); // 继续摆摊
state[x][y] = 1; // 回溯,撤销摆摊
}
dfs(x, y+1, cnt); // 在当前位置不摆摊,继续搜索下一个位置
}
}
int main() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
state[i][j] = 1; // 初始状态所有位置都可以摆摊
}
}
ans = 0;
dfs(0, 0, 0); // 从第一个位置开始搜索
cout << ans << endl;
return 0;
}
```
这里的N表示地图的大小,MOD表示结果需要取模的数。运行结果为 375487154。
阅读全文