N皇后問題(回溯演算法解法)
N皇后問題
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3464 Accepted Submission(s): 1599
你的任務是,對於給定的N,求出有多少種合法的放置方法。
Input 共有若干行,每行一個正整數N≤10,表示棋盤和皇后的數量 Output 共有若干行,每行一個正整數,表示對應輸入行的皇后的不同放置數量。 Sample Input 8 Sample Output 92 由於棋盤的每列只有一個皇后,所i可以用一維向量A(a1,a2,a3……an)來表示第i列皇后所在的行a[i],即解空間的每個結點都有n個兒子,因此解空間大小為n^n,這是一顆子集樹。 約束條件是斜率和行號都不可以相等。 回溯演算法解題思路:
#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,崩潰:(然後改成了優