资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
在一个n*n的棋盘中,每个格子中至多放置一个车,且要保证任何两个车都不能相互攻击,有多少中放法(车与车之间是没有差别的)
输入格式
包含一个正整数n
输出格式
一个整数,表示放置车的方法数
样例输入
2
样例输出
7
数据规模和约定
n<=8
【样例解释】一个车都不放为1种,放置一个车有4种,放置2个车有2种。
思路:类似于n皇后,不过这里不同点是不需要每行都放,可以选择不放
代码如下:
#include<bits/stdc++.h>
using namespace std;
//int a[1001];//放车对应的数字,每行每列的某个位置有特定数字,对n取模一样的说明在同一列
bool a[1001][1001];
int sum=0;
int n;
bool check(int j) {for(int k=0; k<n; k++)if(a[k][j])return false;return true;
}
void search(int col,int havePut) {//i为判断第i行是否放置车,havePut为已经放置了的车 if(col==n){sum+=1;return;}for(int j=0; j<n; j++) {if(check(j)) {//i行j列可放置车a[col][j]=true;//放置了个车search(col+1,havePut+1);a[col][j]=false;}}search(col+1,havePut);//i行不放车
}
int main() {cin>>n;int count=1;//没放车时方法数为1search(0,0);cout<<sum<<endl;
}