1. 程式人生 > >N皇后問題(回溯演算法解法)

N皇后問題(回溯演算法解法)

N皇后問題

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3464    Accepted Submission(s): 1599


Problem Description 在N*N的方格棋盤放置了N個皇后,使得它們不相互攻擊(即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。
你的任務是,對於給定的N,求出有多少種合法的放置方法。

Input 共有若干行,每行一個正整數N≤10,表示棋盤和皇后的數量 Output 共有若干行,每行一個正整數,表示對應輸入行的皇后的不同放置數量。 Sample Input 8 Sample Output 92 由於棋盤的每列只有一個皇后,所i可以用一維向量A(a1,a2,a3……an)來表示第i列皇后所在的行a[i],即解空間的每個結點都有n個兒子,因此解空間大小為n^n,這是一顆子集樹。 約束條件是斜率和行號都不可以相等。 回溯演算法解題思路:
1.針對給定的問題,定義問題的解空間(子集樹還是排列樹) 2.確定易於搜尋的解空間結構 3.以深度優先的方法搜尋解空間,並且在搜尋過程中用剪枝函式避免無效搜尋。
#include <cstdio>
#include <iostream> 
#include <cmath>
using namespace std;

#define NUM 20
int n;
int x[NUM]; 
int sum; 

inline bool Place(int t) 
{ 
	int i; 
	for (i=1; i<t; i++) 
		if ((abs(t-i) == abs(x[i]-x[t])) || (x[i] == x[t])) //斜率相等或者行號相等 
			return false; 
	return true; 
} 

void Backtrack(int t) 
{ 
	int i;
	if (t>n) 
	{
		sum++;
	}
	else
		for (i=1; i<=n; i++) 
		{
			x[t] = i;
			if (Place(t)) Backtrack(t+1);
		}
} 

int main() 
{ 
	while (cin>>n)
	{
		sum = 0;
		Backtrack(1);
		printf("%d\n", sum);
	}
	return 0; 
} 


相關推薦

N皇后問題回溯演算法解法

N皇后問題 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su

n皇后位運算版

其實我也沒覺得多快233333333 #include <cstdio> #include <iostream> #include <algorithm> #i

Leetcode 51:N皇后最詳細的解法!!!

n 皇后問題研究的是如何將 n 個皇后放置在 n×n 的棋盤上,並且使皇后彼此之間不能相互攻擊。 上圖為 8 皇后問題的一種解法。 給定一個整數 n,返回所有不同的 n 皇后問題的解決方案。 每一種解法包含一個明確的 n 皇后問題的棋子放置方案,該

演算法總結——八皇后問題三種解法

問題描述 會下國際象棋的人都很清楚:皇后可以在橫、豎、斜線上不限步數地吃掉其他棋子。如何將8個皇后放在棋盤上(有8 * 8個方格),使它們誰也不能被吃掉!這就是著名的八皇后問題。 對於某個滿足要求的8皇后的擺放方法,定義一個皇后串a與之對應,即a=b1b2...b8,其中b

搜尋&回溯——N皇后hdu2553

題目連結: 題目描述: 在N*N的方格棋盤放置了N個皇后,使得它們不相互攻擊(即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。 你的任務是,對於給定的N,求出有多少種合法的放置方法。 解決思路: 回溯官方課題~用這道題理解回溯再合適不過了

N皇后遞迴演算法

#include<bits/stdc++.h>using namespace std;int c=0;int cheak(int x[],int nowhang){//判斷是否在同一列,在對角 int i;for(i=1;i<nowhang;i++)if(x[i]==x[nowhang]||

N皇后問題回溯遞迴

Problem 八皇后問題是一個以國際象棋為背景的問題:如何能夠在 8×8 的國際象棋棋盤上放置八個皇后,使得任何一個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行、縱行或斜線上。 Solution 八個皇后中任意兩個不能處在

演算法-N皇后遞迴

package MOOC; /** * 輸入整數n,要求n個國際皇后,擺在n*n的棋盤上,使其互相不能攻擊(不在同一行列對角線上),輸出全部方案 */ import java.util.Scann

N皇后遞迴經典演算法

一、N皇后 1、題目 將n個皇后擺放在N*N的棋盤中,互相不可攻擊,有多少種擺放方式,每種擺放方式具體是怎樣的? 2、解題思路 解題思路: 1、將棋盤放在一個二維陣列中,同時設定方向陣列: static const int dx[]

51.N皇后N-Queens

題目描述 n 皇后問題研究的是如何將 n 個皇后放置在 n×n 的棋盤上,並且使皇后彼此之間不能相互攻擊。 給定一個整數 n,返回所有不同的 n 皇后問題的解決方案。 每一種解法包含一個明確的 n 皇后問題的棋子放置方案,該方案中 ‘Q’ 和 ‘.’ 分別代表了皇后和空位。 示例:

皇后回溯

package 習題; public class 八皇后 { static int c[] = new int[8]; static int total = 0; public static void main(String[] args) { queen(0); System.ou

迷宮回溯演算法

要想解決迷宮問題,首先搞明白八皇后,迷宮問題是回溯和貪心的產物。 題目:現有一個迷宮如圖: 黃色五角星為迷宮的起點,紅色五角星為迷宮的終點。 要求:找到從起點到終點的所有路線。 思路:我們的目的為了到達終點,所以一定要向著終點的方向出發。 因為迷宮

LeetCode演算法題-Longest Palindrome五種解法

這是悅樂書的第220次更新,第232篇原創 01 看題和準備 今天介紹的是LeetCode演算法題中Easy級別的第87題(順位題號是409)。給定一個由小寫或大寫字母組成的字串,找到可以用這些字母構建的最長的迴文長度。這是區分大小寫的,例如“Aa”在這裡不被視為迴文。例如: 輸入:“abccccdd

0-1揹包問題:回溯演算法

#include <iostream> #define N 205 using namespace std; double w[N],v[N]; double CurW=0; double CurV=0; double c; double BestV=0; int BestX[N

馬踏棋盤回溯演算法

馬可以走的位置如圖: 要求: 找到所有馬從任意一個位置出發遍歷整個棋盤的一條路徑 演算法實現: #include<stdlib.h> #include<stdio.h&g

演算法】最近點對問題暴力破解法

簡單的畫了一張圖: 通過暴力方式,進行一次比較獲取兩個點之間的最短距離: //點對最近問題(暴力破解法) #include<iostream> #include<cmath> using namespace std; doub

N-皇后回溯解法

回溯演算法的基本思想是:從一條路往前走,能進則進,不能進則退回來,換一條路再試。#include <stdio.h> #include <math.h> #include <

POJ 1644 分蘋果 遞歸解法

分析 sample output name sca out -m 遞歸解法 iostream 把M個同樣的蘋果放在N個同樣的盤子裏,允許有的盤子空著不放,問共有多少種不同的分法?(用K表示)5,1,1和1,5,1 是同一種分法。 Input 第一行是測試數據的數目t(0 &

洛谷:P3281 [SCOI2013]數數 優秀的解法

iostream fread bsp www. -- 輸出 har 超過 names 刷了這麽久的數位 dp ,照樣被這題虐,還從早上虐到晚上,對自己無語...(機房裏又是只有我一個人,寂寞。) 題目:洛谷P3281 [SCOI2013]數數 題目描述

HDU-3790 最短路徑問題 Dijkstra演算法優化

題目傳送門 題目:給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。 這是一道模板題,然而卻做了整整一下午,剛開始用的Bellman-Ford的佇列優化做的,結果TLE,崩潰:(然後改成了優