日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

蓝桥杯 基础练习 2n皇后

發(fā)布時(shí)間:2024/9/30 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 蓝桥杯 基础练习 2n皇后 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目? ?錄

題目描述

題解

【算法】八皇后,藍(lán)橋杯2n皇后 算法思路詳細(xì)講解(Java)


題目描述

題目描述
給定一個(gè) n × n 的棋盤(pán),棋盤(pán)中有一些位置不能放皇后。

現(xiàn)在要向棋盤(pán)中放入 n 個(gè)黑皇后和 n 個(gè)白皇后,使任意的兩個(gè)黑皇后都不在同一行、同一列或同一條對(duì)角線(xiàn)上;

任意的兩個(gè)白皇后都不在同一行、同一列或同一條對(duì)角線(xiàn)上。

問(wèn)總共有多少種放法?n 小于等于 8。

輸入格式
輸入的第一行為一個(gè)整數(shù) n,表示棋盤(pán)的大小。
接下來(lái) n 行,每行 n 個(gè) 0 或 1 的整數(shù),整數(shù)為 1,表示該位置可以放皇后;整數(shù)為 0,表示該位置不可以放皇后。

輸出格式
輸出一個(gè)整數(shù),表示總共有多少種放法。

樣例輸入
4
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1

樣例輸出
2

題解

原文鏈接

package B基礎(chǔ)練習(xí);import java.util.*;public class A27_2n皇后2 {static int n;static int count = 0; // 統(tǒng)計(jì)static boolean flag = true; // 用于標(biāo)記是在放白棋子還是黑棋子public static void main(String[] args) {Scanner scanner = new Scanner(System.in);n = scanner.nextInt();int[][] arr = new int[n][n];int[] white = new int[n];int[] black = new int[n];for (int i = 0; i < n; i++) {white[i] = Integer.MAX_VALUE;black[i] = Integer.MAX_VALUE;}for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {arr[i][j] = scanner.nextInt();}}dfs(arr, white, black, 0);System.out.println(count);}private static void dfs(int[][] arr, int[] white, int[] black, int row) {if (row == white.length) {if (flag) {flag = !flag;// 用交換參數(shù)位置,進(jìn)行黑色棋子的擺放dfs(arr, black, white, 0);// 白色棋子放完后,開(kāi)始放黑色棋子flag = !flag;// 回溯} else {// 兩種棋子都放完了count++;}return;}for (int i = 0; i < n; i++) {if (check(arr, white, row, i)) {white[row] = i;if (flag)arr[row][i] = 2;elsearr[row][i] = 3;dfs(arr, white, black, row + 1);white[row] = Integer.MAX_VALUE;arr[row][i] = 1;// 回溯}}}private static boolean check(int[][] arr, int[] a, int x, int y) {if (arr[x][y] == 2)return false;// 白色棋子占了if (arr[x][y] == 0)return false;// 這個(gè)位置不能放皇后for (int i = 0; i < a.length; i++) {if (a[i] == y)// 檢查列return false;if (i - a[i] == x - y)// 檢查主對(duì)角線(xiàn)return false;if (i + a[i] == x + y)// 檢查副對(duì)角線(xiàn)return false;}return true;}}

【算法】八皇后,藍(lán)橋杯2n皇后 算法思路詳細(xì)講解(Java)

package B基礎(chǔ)練習(xí);public class A27_2n皇后 {static int n = 4, count; // n階棋盤(pán)public static void main(String[] args) {int[][] mainChess = new int[n][n]; // for (int i = 0; i < n; i++) { // Java數(shù)組初始化元素默認(rèn)為0 // for (int j = 0; j < n; j++) { // mainChess[i][j] = 0; // } // }putChess(0, mainChess);}public static void putChess(int row, int[][] chess) {int[][] currentChess = (int[][]) chess.clone();if (row == n) {count++;System.out.println("第" + count + "種:");for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {System.out.print(currentChess[i][j]);}System.out.println();}System.out.println();return;} else {for (int i = 0; i < n; i++) {if (!isDanger(row, i, currentChess)) {for (int j = 0; j < n; j++) {currentChess[row][j] = 0;}currentChess[row][i] = 1;putChess(row + 1, currentChess);}}}}public static boolean isDanger(int row, int col, int[][] currentChess) {for (int i = 0; i < row; i++) {if (currentChess[i][col] == 1) {return true;}for (int j = 0; j < n; j++) {if (((row + col) == (i + j) || (row - col) == (i - j)) && currentChess[i][j] == 1) {return true;}}}return false;}}

?

總結(jié)

以上是生活随笔為你收集整理的蓝桥杯 基础练习 2n皇后的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。