问题描述
在一个n*n的棋盘中,每个格子中至多放置一个车,且要保证任何两个车都不能相互攻击,有多少中放法(车与车之间是没有差别的)
输入格式
包含一个正整数n
输出格式
一个整数,表示放置车的方法数
样例输入
2
样例输出
7
数据规模和约定
n<=8
【样例解释】一个车都不放为1种,放置一个车有4种,放置2个车有2种。
解题思路:
车的放置是8皇后问题的简化版,当用一维数组标记时,只需考虑列不冲突就行。与8皇后不同的是,车的放置不需要将棋盘都摆满,当有某行或某列空出来也可以。最后用深度搜索加回溯解决。
java代码:
import java.io.*;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
Temp996b temp = new Temp996b(n);
temp.dfs(1);//从第一行开始摆放
System.out.println(temp.ans);
}
}
class Temp996b{
int n;
int ans = 1;
boolean visited[] = new boolean[9];//表示第几列是否摆放
public Temp996b(int n) {
this.n = n;
}
public void dfs(int step) {//表示棋子应放到第temp行
if(step > n) {//递归出口:当前摆放行数超出棋盘总行数
return;
}
for(int i = 1; i <= n; i++) {
if(!visited[i]) {//step行的第i列为空
visited[i] = true;//已放置
ans++;
dfs(step + 1);//递归至下一行摆放
visited[i] = false;//回溯:将step行重置
}
}
dfs(step + 1);//有空行情况,将step行跳过(不摆放)
}
}