1. 程式人生 > >基礎練習 2n皇后問題 (兩次DFS)

基礎練習 2n皇后問題 (兩次DFS)

問題描述   給定一個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

問題分析:很簡單能想到的就是先把其中一個顏色的皇后排了,然後再排另一個顏色,這裡我假設先把黑皇后排列好,當黑皇后排列好厚再排列白皇后,每次白皇后排列好後計數就加1,而能想到排列的話一定用的事DFS,所以就是在黑皇后排好後再排白皇后也就是黑皇后DFS到最後一排後再巢狀一個白皇后的DFS

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;

int maze[10][10];
int bqueen[10];		//bqueen[i]表示第i的皇后所處的列數 
int wqueen[10];		//同上 
int Count = 0;
int n;

int wdfs(int row)
{
	//同樣判斷(剛剛填充的第row-1行的皇后和之前的每一個比較 
	int check;
	for(int i=1; i<row-1; i++)
	{
		check = wqueen[row-1]-wqueen[i];
		if (check==0 || check==row-1-i || -check==row-1-i)
			return 0;	
	} 
	
	//白皇后填充完畢,計數
	if (row==n+1)
	{
		Count++;
		return 0;
	} 
	
	for(int i=1; i<=n; i++)
	{
		if (maze[row][i]==1 && bqueen[row]!=i)
		{
			wqueen[row] = i;
			wdfs(row+1); 
		}	
	} 
}

int bdfs(int row)
{
	//判斷是否同列以及在對角線 
	int check;
	for(int i=1; i<row-1; i++)
	{
		check = bqueen[row-1]-bqueen[i];	//列數之差 
		if (check==0 || check==row-1-i || -check==row-1-i)	//row-1-i位行數之差
			return 0; 
	}
	
	//黑皇后填充完畢 ,填充白皇后 
	if (row==n+1)
	{
		wdfs(1);
		return 0;
	}
	
	for(int i=1; i<=n; i++)
	{
		if (maze[row][i]==1) 
		{
			bqueen[row] = i;
			bdfs(row+1);
		}
	}
}

int main()
{
	scanf("%d",&n);
	
	for(int i=1; i<=n; i++)
		for(int j=1; j<=n; j++)
			scanf("%d",&maze[i][j]);
			
	memset(bqueen,0,sizeof(bqueen));
	memset(wqueen,0,sizeof(wqueen));

	bdfs(1);	//先排黑皇后
	
	printf("%d\n",Count);
	return 0;	
}


相關推薦

基礎練習 2n皇后問題 DFS

問題描述   給定一個n*n的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入n個黑皇后和n個白皇后,使任意的兩個黑皇后都不在同一行、同一列或同一條對角線上,任意的兩個白皇后都不在同一行、同一列或同一條對角線上。問總共有多少种放法?n小於等於8。 輸入格式   輸入的第一行為一個整數n,表示棋盤

藍橋杯 PREV-9 大臣的旅費 DFS

題意:求樹中最遠的兩個點的距離。 解題方案:第一遍dfs,任取一個點,找到離它最遠的點a,第二遍dfs,以a為起點,找到離a最遠的點b,ab即為樹中最遠的兩個點。證明:樹的直徑(最長路)的詳細證明。

藍橋杯之大臣的旅費dfs

之間 NPU fin ble 過大 編號 http sample 題目 Description 很久以前,T王國空前繁榮。為了更好地管理國家,王國修建了大量的快速路,用於連接首都和王國內的各大城市。 為節省經費,T國的大臣們經過思考,制定了一套優秀的修建方案,使得任

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

我們先學習下經典案例中的八皇后問題接著學習2n皇后問題問題描述  給定一個n*n的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入n個黑皇后和n個白皇后,使任意的兩個黑皇后都不在同一行、同一列或同一條對角線上,任意的兩個白皇后都不在同一行、同一列或同一條對角線上。問總共有

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

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

基礎練習 2n皇后問題 dfs

問題描述   給定一個n*n的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入n個黑皇后和n個白皇后,使任意的兩個黑皇后都不在同一行、同一列或同一條對角線上,任意的兩個白皇后都不在同一行、同一列或同一條對角線上。問總共有多少种放法?n小於等於8。 輸入格式  

[Java] 藍橋杯BASIC-27 基礎練習 2n皇后問題

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

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

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

基礎練習 2n皇后問題 ——回溯法,貪心演算法

/*基礎練習 2n皇后問題問題描述  給定一個n*n的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入n個黑皇后和n個白皇后,使任意的兩個黑皇后都不在同一行、同一列或同一條對角線上,任意的兩個白皇后都不在同一行、同一列或同一條對角線上。問總共有多少种放法?n小於等於8。輸

51Nod 1095 Anigram單詞 map

一個單詞a如果通過交換單詞中字母的順序可以得到另外的單詞b,那麼定義b是a的Anigram,例如單詞army和mary互為Anigram。另:相同的2個單詞不算Anigram。現在給定一個字典,輸入Q個單詞,從給出的字典中找出這些單詞的Anigram。 收起 輸入 第1行:1個數N,表示

1111 Online Map 30 分dij

1111 Online Map (30 分) Input our current position and a destination, an online map can recommend several paths. Now your job is to recommend two pat

Silver Cow PartyDijstra

Silver Cow Party One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1…N is going to attend the big cow party to be held at farm #

UVA11624 Fire! BFS 讀懂題意很重要

題目:https://uva.onlinejudge.org/index.phpoption=com_onlinejudge&Itemid=8&page=show_problem&problem=2671題意:就是迷宮著火了,火勢會蔓延,Joe要逃跑,

傳輸中文的亂碼的原因及解決方式encodeURI()轉碼;

.encodeURL函式主要是來對URI來做轉碼,它預設是採用的UTF-8的編碼. . UTF-8編碼的格式:一個漢字來三個位元組構成,每一個位元組會轉換成16進位制的編碼,同時新增上%號. 假設頁面端輸入的中文是一個 “中”,按照下面步驟進行解碼 1.第

筆試演算法題--股票買賣問題買賣

題目:一個人一天只能進行最多兩次買和兩次賣,並且只有賣了才能繼續買。問一天可以獲得的最大收益,要採用時間複雜度低的實現。 股票價格為:10,22,5,75,65,80.答案:87(10買,22賣,5買,80賣) 動態規劃解決方法:設定陣列dp[i][j]表示:prices[

uva 11624 大火蔓延的迷宮 Fire!bfs

 題目:一個平面迷宮中有一個人,迷宮中有些點起火了,火和人每個單位時間只能向相鄰的格子移動,             其中有一些空間被牆壁佔據,問這個人在不背或燒到的情況下,離開迷宮的最快時間。 思路是先用bfs預處理每個格子起火的時間,在來一次bfs走迷宮,入隊時判斷

POJ 1239 Increasing Sequences經典的dp

style blank cnblogs open clu 一位 class blog 思路 http://poj.org/problem?id=1239 題意:給出一串序列,現在要添加逗號作為分隔符,使得序列是遞增序列,然後讓最後一個數盡量小,第一個數盡量大。 思

Spring3 Schedule Task之註解實現 起動Schedule Task 的解決方案

什麽 empty task 文件中 註解 work lin schedule ask Spring3 Schedule Task之註解實現 (兩次起步Schedule Task 的解決方案)Spring3 Schedule Task之註解實現 (兩次啟動Schedule T

【NOIP2017練習】函數變換DP,dfs

col close gin const cnblogs max 題意 .cn for 題意: 思路: 極限步數大概不會超過30 1 const max=100000; 2 var dp:array[1..max,0..2]of longint; 3

hdu1828線段樹掃描+離散化

for 掃描 方向 body 理解 upd sort 有序 ide 題目鏈接 求周長並,思路和註意事項與求面積並類似,我用了最簡單的思路,即x軸做一次線段樹,y軸做一次線段樹。 還有一種方法,只做一次線段樹,在做線段樹的同時求另一個方向的長度,大概的想法我知道,不過在左右區