试题 算法训练 车的放置 java 题解 996

问题描述

  在一个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行跳过(不摆放)
	}
}

提交截图:

Guess you like

Origin blog.csdn.net/weixin_48898946/article/details/121587978