题目:
资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
在一个n*n的棋盘中,每个格子中至多放置一个车,且要保证任何两个车都不能相互攻击,有多少中放法(车与车之间是没有差别的)
输入格式
包含一个正整数n
样例输入
2
样例输出
7
数据规模和约定
n<=8
【样例解释】一个车都不放为1种,放置一个车有4种,放置2个车有2种。
解题思路:
首先,这里车不能互相攻击的意思是不能同行同列,与八皇后问题类似
我们从上往下依次枚举出每一行的状态,以此确定最终结果
1. 先看第一行所有状态,由于此前没有其它汽车,那么这一行汽车可以放在任何位置,也可以不放
如图(假定n == 3)
2. 在考虑第一行的基础上,以同样的方式枚举第二行的4种状态,若不行则直接跳过即可
假设第一行已经放在了第一个位置上,那么如下:
第二行不能放第一个,因为同列了
3. 与之前类似,考虑前俩行状态,枚举第三行所有4种可能,若冲突则跳过:
注意:这种情况下汽车是不可能同行的,只要一个数组保存之前占用的列即可
因此得出代码如下:
#include <bits/stdc++.h>
using namespace std;
long long ans;
int n;
bool can[10]; //判断列是否冲突
void dfs(int row)
{
if (row == n)
{
ans++;
return;
}
//1. 先模拟这一行啥都没放情况
dfs(row + 1);
//2. 模拟放一个位置情况
for (int col = 0; col < n; col++)
{
if (!can[col]) continue;
can[col] = false;
dfs(row + 1);
can[col] = true;
}
}
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
can[i] = true;
dfs(0);
cout << ans;
return 0;
}