Java 洛谷 P1219 八皇后
生活随笔
收集整理的這篇文章主要介紹了
Java 洛谷 P1219 八皇后
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:https://www.luogu.com.cn/problem/P1219
代碼實例:
import java.util.Scanner; /** * @author: 梁樹鵬*/ public class luogu2_7_1219 {/** 舉例說明:a[]* a為存放每一行,皇后的位置,a[1]=6,代表第一行的皇后放在位置6,以此類推bcd* */static int a[] = new int[1000];//a存放每一行皇后的位置static int b[] = new int[1000];//b代表每一列,是否被放置了皇后static int c[] = new int[1000];//c存左下到右上的對角線(行+列的和相同)static int d[] = new int[1000];//d存左上到右下的對角線(行-列的差相同),注意有負數的情況,請看下面static int n = 0,s = 0;public static void main(String args[]) {Scanner scanner = new Scanner(System.in);n = scanner.nextInt();//從第一個皇后開始搜索,即第一行search(1); System.out.println(s);scanner.close();}//用于輸出的函數public static void print(){int i;s++;if(s<=3){for(i=1;i<=n;i++) {System.out.print(a[i]+" ");//a存儲的就是皇后的位置}System.out.println();}}//搜索、回溯、標記public static int search(int i){for(int j=1;j<=n;j++) {if(b[j]==0 && c[i+j]==0 && d[i-j+n]==0){//判斷是否可以放棋子a[i]=j;//標記i排是第j個 b[j]=1;//宣布占領縱列j/*** 注釋:對角線d[i-j]后面必須加上一個n,因為i-j可能為負數,那么數組就會出錯* 所以將整體向右偏移n個單位(坐標偏移不會影響我們需要達到的目的)* 將所有可能變成正數;(因為i-j的最小值是-n+1,所以加上一個n就一定會變成一個正數)*/c[i+j]=1; d[i-j+n]=1;//宣布占領兩條對角線if(i==n) {print();//輸出,已經放完所有皇后} else {search(i+1);//放置第i+1個皇后}b[j]=0;c[i+j]=0;d[i-j+n]=0;//回溯,對放置皇后的位置釋放標記,嘗試下一個位置是否可行}}return 0;} }總結
以上是生活随笔為你收集整理的Java 洛谷 P1219 八皇后的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java实现搜索回溯经典题目
- 下一篇: Java 洛谷 P1426 小鱼会有危险