1. 程式人生 > >藍橋杯-基礎練習-java-2n皇后問題

藍橋杯-基礎練習-java-2n皇后問題

  基礎練習 2n皇后問題  時間限制:1.0s   記憶體限制:512.0MB問題描述  給定一個n*n的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入n個黑皇后和n個白皇后,使任意的兩個黑皇后都不在同一行、同一列或同一條對角線上,任意的兩個白皇后都不在同一行、同一列或同一條對角線上。問總共有多少种放法?n小於等於8。輸入格式  輸入的第一行為一個整數n,表示棋盤的大小。
  接下來n行,每行n個0或1的整數,如果一個整數為1,表示對應的位置可以放皇后,如果一個整數為0,表示對應的位置不可以放皇后。輸出格式  輸出一個整數,表示總共有多少种放法。樣例輸入4
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1樣例輸出2樣例輸入4
1 0 1 1
1 1 1 1
1 1 1 1
1 1 1 1樣例輸出0
import java.util.Scanner;
public class Main
{
	static int sum=0;//統計符合的數目
	public static void main(String[] args) 
	{
		Scanner db=new Scanner (System.in);
		int n=db.nextInt();
		int arr[]=new int [n]; //皇后放置位置
		int wee[][]=new int [n][n];// 接受輸入時的0 1
		for(int i=0; i<n; i++)
			for(int j=0; j<n; j++)
				wee[i][j]=db.nextInt();
		queen(0, 0, arr, wee);//遞迴呼叫
		System.out.println(sum);
	}
	public static int queen(int su, int k, int arr[], int[][] wee)
	//su==0表示落子的是白皇后	為1 表示落子的是黑皇后   k表示第k個皇后
	{
		if(k==arr.length)//如果所有皇后都放置
		{
			if(su==0)//判斷放置的是否是白皇后
			{
				arr=new int[arr.length];	//如果白皇后都被放置,初始化黑皇后的位置
				queen(su+1, 0, arr, wee);
			}
			if(su==1)//判斷放置的是否是白皇后
				sum++;	//統計2n皇后的放置種數
			return sum;
		}
		for(int i=0; i<arr.length; i++)//判斷第k個皇后位置(列數)行數為k
		{
			if(wee[k][i]==0)	//如果當前位置座標值為零,則不能放置皇后
				continue;
			int j;
			for(j=0; j<k; j++)//前k-1個皇后位置(列數)行數 為j
				if(arr[j]==i||Math.abs(arr[j]-i)==(k-j))//判斷皇后之間是否存在同一列,統一對角線衝突
					break;
			if(j==k)//條件成立時表示第k個與之前的沒有衝突
			{
				arr[k]=i;	//第k個皇后位置
				wee[k][i]=0; //將此位置即為0 表示不能再這放置皇后
				queen(su, k+1, arr, wee);	//遞迴呼叫下一層
				wee[k][i]=1;
			}
		}
		return sum;
	}
}

相關推薦

藍橋-基礎練習-java-2n皇后問題

  基礎練習 2n皇后問題  時間限制:1.0s   記憶體限制:512.0MB問題描述  給定一個n*n的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入n個黑皇后和n個白皇后,使任意的兩個黑皇后都不在同一行、同一列或同一條對角線上,任意的兩個白皇后都不在同一行、同一列

藍橋 基礎練習 2n皇后問題【DFS + 回溯】

時間限制:1.0s 記憶體限制:512.0MB 問題描述   給定一個n*n的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入n個黑皇后和n個白皇后,使任意的兩個黑皇后都不在同一行、同一列或同一條對角線上,任意的兩個白皇后都不在同一行、同一列或同

藍橋-基礎練習java 數列排序問題

repl 給定 can .cn turn exti color 問題 http 問題描述   給定一個長度為n的數列,將這個數列按從小到大的順序排列。1<=n<=200 輸入格式   第一行為一個整數n。  第二行包含n個整數,為待排序的數,每個整數的絕對值小

藍橋 基礎練習 矩陣乘法(java)

話不多說,直接上程式碼。 import java.util.Scanner; public class Main4 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n

藍橋 基礎練習VIP 字串對比(Java解題)

給定兩個僅由大寫字母或小寫字母組成的字串(長度介於1到10之間),它們之間的關係是以下4中情況之一: 1:兩個字串長度不等。比如  Beijing  和  Hebei 2:兩個字串不僅長度相等,而且相應位置上的字元完全一致(區分大小寫),比如  Beijing  和  Beijing 3:兩個字串長度相等,相

藍橋 基礎練習VIP 矩形面積交(java

矩形面積交題目描述平面上有兩個矩形,它們的邊平行於直角座標系的X軸或Y軸。對於每個矩形,我們給出它的一對相對頂點的座標,請你程式設計算出兩個矩形的交的面積。輸入輸入僅包含兩行,每行描述一個矩形。 在每行中,給出矩形的一對相對頂點的座標,每個點的座標都用兩個絕對值不超過10^7

藍橋基礎練習----數列排序(java)

問題描述  給定一個長度為n的數列,將這個數列按從小到大的順序排列。1<=n<=200輸入格式  第一行為一個整數n。  第二行包含n個整數,為待排序的數,每個整數的絕對值小於10000。輸出格式  輸出一行,按從小到大的順序輸出排序後的數列。樣例輸入58 3 6

藍橋 基礎練習 階乘計算 java

問題描述  輸入一個正整數n,輸出n!的值。  其中n!=1*2*3*…*n。演算法描述  n!可能很大,而計算機能表示的整數範圍有限,需要使用高精度計算的方法。使用一個數組A來表示一個大整數a,A[0]表示a的個位,A[1]表示a的十位,依次類推。  將a乘以一個整數k變為

Java-藍橋- 基礎練習 十六進位制轉十進位制

題目 問題描述   從鍵盤輸入一個不超過8位的正的十六進位制數字符串,將它轉換為正的十進位制數後輸出。   注:十六進位制數中的10~15分別用大寫的英文字母A、B、C、D、E、F表示。 樣例輸入

藍橋 基礎練習 數列排序 JAVA

import java.util.Arrays; import java.util.Scanner; class Main { public static void main(String[] args) { Scanner sc = new Scanner(Sys

藍橋 基礎練習 十六進位制轉十進位制 java

題目描述 給出一個非負整數,將它表示成十六進位制的形式。 輸入格式 輸入包含一個非負整數a,表示要轉換的數。0<=a<=2147483647 輸出格式 輸出這個整數的16進製表

藍橋基礎練習---矩陣乘法

cst ans 時間限制 str 絕對值 忘記 個數 clu 表示 基礎練習 矩陣乘法 時間限制:1.0s 內存限制:512.0MB 錦囊1 錦囊2 錦囊3 問題描述   給定一個N

藍橋 基礎練習 BASIC-12 十六進制轉八進制

info div for 限制 class 輸入 字符 字母 res 基礎練習 十六進制轉八進制 時間限制:1.0s 內存限制:512.0MB 問題描述  給定n個十六進制正整數,輸出它們對應的八進制數。輸入格式  輸入的第一行為一個正整數n (1<=n

藍橋- 基礎練習: 字母圖形

alt gpo pan 圖片 -- ext .com color ack import java.util.Scanner; public class W { /* A B C D E F G B A B C D E F C B A B C D E D C B A

藍橋 基礎練習 十六進制轉八進制

spa tro rgs number 解決 ann ret else if ger import java.util.*;public class Main { public static void main(String[] args) { Scann

藍橋 基礎練習 十六進制轉十進制

溢出 oid import scan post 文件 ava 轉化 藍橋杯 import java.util.*;public class Main { public static void main(String[] args) { Scanner s

藍橋 基礎練習 十進制轉十六進制

out pos hex can ati static sca ner 十進制 import java.util.*;public class Main { public static void main(String[] args) { Scanner

藍橋 基礎練習 特殊回文數

pan void system ali i++ 數據 util new style /*基礎練習 特殊回文數問題描述  123321是一個非常特殊的數,它從左邊讀和從右邊讀是一樣的。  輸入一個正整數n, 編程求所有這樣的五位和六位十進制數,滿足各位數字之和等於n 。輸入格

藍橋 基礎練習 字母圖形

int() [] 基礎練習 tin next can abc out ann /** * 問題描述 利用字母可以組成一些美麗的圖形,下面給出了一個例子: ABCDEFG BABCDEF CBABCDE DCBABCD EDCBABC 這是一個5行7列的圖形,請找出這個圖形的

藍橋基礎練習 完美的代價

iostream div amp sin 移動 第一次 第一個 對稱 個數 問題描述   回文串,是一種特殊的字符串,它從左往右讀和從右往左讀是一樣的。小龍龍認為回文串才是完美的。現在給你一個串,它不一定是回文的,請你計算最少的交換次數使得該串變成一個完美的回文串。  交換