N皇后问题-Java

本文介绍了如何使用Java解决经典算法问题——N皇后问题。通过详细阐述问题描述、输入和输出,以及提供两种不同的代码实现,文章旨在帮助读者理解并掌握解决N皇后问题的Java编程技巧。
摘要由CSDN通过智能技术生成

问题描述

在棋盘上放置n个皇后,使得她们互不攻击,此时每个皇后的攻击范围为同行同列和同对角线,要求找出所有解。

输入

8

输出

92

代码一

import java.util.ArrayList;
import java.util.Scanner;

public class Main {
	static int n, result = 0;
	static ArrayList<Integer> arrayList = new ArrayList<Integer>();

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		while (in.hasNext()) {
			n = in.nextInt();
			search(0);
			System.out.println(result);

		}
		in.close();
	}

	public static void search(int row) {

		// 递归边界,到达这一步则说明皇后都不冲突
		if (row == n) {
			result++;
		} else {
			for (int i = 0; i < n; i++) {// n列
				boolean flag = true;
				// 把第row行的皇后放在第i列
				// 当第row行没有元素时,增加,有则替换
				if (arrayList.size() <= row) {
					arrayList.add(new Integer(i));
				} else {
					arrayList.set(row, new Integer(i));
				}
				
				// 检查是否和前面的皇后冲突
				// 因为是一行一行放的的,所以行不冲突
				// 所以只需要检查列和对角线
				// 格子(x,y)的y-x标识主对角线,x+y标识副对角线
				for (int j = 0; j < row; j++) {
					if (arrayList.get(j).intValue() == arrayList.get(row).intValue()
							|| row + arrayList.get(row).intValue() == j + arrayList.get(j).intValue()
							|| arrayList.get(j).intValue() - j == arrayList.get(row).intValue() - row) {
						flag = false;
						break;
					}
				}

				// 不冲突则继续递归
				if (flag) {
					search(row + 1);

				}

			}
		}

	}

}

代码二

import java.util.ArrayList;
import java.util.Scanner;

public class Main {
	static int n, result = 0;
	static ArrayList<Integer> arrayList = new ArrayList<Integer>();
	static boolean[][] flag;

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		while (in.hasNext()) {
			n = in.nextInt();
			flag = new boolean[3][2*n];
			search(0);
			System.out.println(result);

		}
		in.close();
	}

	public static void search(int row) {

		// 递归边界,到达这一步则说明皇后都不冲突
		if (row == n) {
			result++;
		} else {
			for (int i = 0; i < n; i++) {// n列

				// 把第row行的皇后放在第i列
				// 当第row行没有元素时,增加,有则替换
				// 检查是否和前面的皇后冲突
				// 因为是一行一行放的的,所以行不冲突
				// 所以只需要检查列和对角线
				// 格子(x,y)的y-x标识主对角线,x+y标识副对角线
				// 使用二维数组判断
				if (!flag[0][i] && !flag[1][row + i] && !flag[2][row - i + n]) {
					if (arrayList.size() <= row) {
						arrayList.add(new Integer(i));
					} else {
						arrayList.set(row, new Integer(i));
					}
					flag[0][i] = flag[1][row + i] = flag[2][row - i + n] = true; // 修改全局变量
					search(row + 1);
					flag[0][i] = flag[1][row + i] = flag[2][row - i + n] = false; // 恢复全局变量
				}

			}
		}

	}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值