试题 算法训练 车的放置
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
在一个n*n的棋盘中,每个格子中至多放置一个车,且要保证任何两个车都不能相互攻击,有多少中放法(车与车之间是没有差别的)
输入格式
包含一个正整数n
输出格式
一个整数,表示放置车的方法数
样例输入
2
样例输出
7
数据规模和约定
n<=8
【样例解释】一个车都不放为1种,放置一个车有4种,放置2个车有2种。
代码如下:
import java.util.Scanner;
public class Main {
static int n; // 棋盘的行列数
static int[][] visit; // 是否访问过改位置
static int way = 1; // 放置的方法数
public static void main(String[] args) {
@SuppressWarnings("resource")
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
visit=new int[n][n];
solve();
System.out.println(way);
}
private static boolean stop(int i, int j){ // 检查是否需要跳过本次循环的函数
for (int x=0;x<n;x++){
if (visit[x][j]==1) // 当同一列有车时,返回真
return true;
}
for (int y=0;y<n;y++){ // 当同一列有车时,返回真
if (visit[i][y]==1)
return true;
}
return false;
}
private static void solve(){
for (int i=0;i<n;i++){ // 搜索每种情况
for (int j=0;j<n;j++){
if (stop(i,j)) {// 结束标志为真时,跳过本次循环,进入下一行
break;
}else {
visit[i][j] = 1; // 设置访问标志为1
way += 1; // 方法数加一
solve();
visit[i][j] = 0; // 回溯
}
}
}
}
}