1. 程式人生 > >hdu2553 N皇后問題--DFS

hdu2553 N皇后問題--DFS

一:原題內容

Problem Description 在N*N的方格棋盤放置了N個皇后,使得它們不相互攻擊(即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。
你的任務是,對於給定的N,求出有多少種合法的放置方法。
Input 共有若干行,每行一個正整數N≤10,表示棋盤和皇后的數量;如果N=0,表示結束。 Output 共有若干行,每行一個正整數,表示對應輸入行的皇后的不同放置數量。 Sample Input 1 8 5 0 Sample Output 1 92 10

二:AC程式碼

#define _CRT_SECURE_NO_DEPRECATE 
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1  

#include <iostream>

using namespace std;

int a[11][11];//皇后棋盤,第一行第一列捨棄,其中第一列用來儲存每一行皇后的列座標
int b[11];//打表所用的陣列

int N;
int num;
void DFS(int n, int & m);

int main()
{
	//////1.打表
	for (int i = 1; i < 11; i++)
	{
		num = 0;
		DFS(1,i);
		b[i] = num;
	}

	//////2.
	while (cin >> N&&N != 0)
	{
		cout << b[N] << endl;
	}

	return 0;
}
bool isLegal(int & x, int & y)//判斷棋盤上座標為x,y是否可以放置皇后
{
	for (int i = 1; i < x; i++)
	{
		if (a[i][0] == y || abs(i - x) == abs(a[i][0] - y))
			return false;
	}

	return true;
}

void DFS(int n,int & m)//n代表搜尋到第n行,m代表是m皇后
{
	if (n == m+1)
		num++;
	else
	{
		for (int i = 1; i <= m; i++)
		{
			if (isLegal(n, i))
			{
				a[n][0] = i;
				//a[n][i]=1;
				DFS(n + 1, m);
			}
			//a[n][i] = 0;
		}
	}
}


相關推薦

hdu2553 N皇后問題--DFS

一:原題內容 Problem Description 在N*N的方格棋盤放置了N個皇后,使得它們不相互攻擊(即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。

hdu2553 n皇后問題 dfs搜尋 記憶化

N皇后問題 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 21710    Accepted Submis

hdu2553 N皇后問題(回溯dfs

剛開始怎麼也想不通怎麼斜向判斷,看了詳解,服了。。戳這裡N皇后詳解 準確的說他是用了滾動陣列,分別用三行記錄正對角線,縱向,反對角線方向所放置過皇后所能影響的狀態記錄。若在攻擊範圍內,則標記1。而且

HDU2553 N皇后問題【回溯法】

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

HDU2553 N皇后問題(回溯法)

此題是經典的N皇后問題,描述:在一個N*N的棋盤上要擺放N個皇后,要求任意兩個皇后不能在同一行,同一列或者同一條與棋盤的邊成45度角的斜線上,即與對角線平行的斜線上,求對於不同的N,各有多少種擺法使任意兩個皇后不能相互攻擊。 用回溯法就可以解決,設皇后的編號依次為1,2,

hdu2553 n皇后問題(純粹回溯法)

#include <iostream> #include <string> #include <stdio.h> #include <algorithm> #include <math.h> //n皇后問題用一維陣列

n皇后問題(dfs練習)hdu2553

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

HDU2553N皇后問題(DFS)

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

N皇后問題(DFSN皇后問題

<span style="font-size:14px;"><span style="font-size:14px;">#include<cstdio> #include<cstdlib> using namespace std; int n,m,temp; i

經典DFSN皇后問題

N皇后問題 題目 Time Limit:1000MS Memory Limit:32768KB Description 在N*N的方格棋盤放置了N個皇后,使得它們不相互攻擊(即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋

搜尋&回溯——N皇后hdu2553

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

DFSN皇后問題

侵刪。 #include <stdio.h> #include <string.h> int map[20][20],cnt; int ans[20] = {0},num,n; void dfs(int x,int y)

hdu2553皇后問題(DFS

在N*N的方格棋盤放置了N個皇后,使得它們不相互攻擊(即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。 你的任務是,對於給定的N,求出有多少種合法的放置方法。 Input共有若干行,每行一個正整數N≤10,表示棋盤和皇后的數量;如果N

hdu2553(詳解)N皇后問題

N皇后問題 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 21697    Accepted Submi

dfs n皇后問題

#include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> #include<algorithm> #include<iostream> #includ

N皇后問題(hdu2553

N皇后問題 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7656    Accepted Submissio

DFS解決n皇后問題

問題描述 在nxn格的棋盤上放置彼此不受攻擊的n個皇后。按照國際象棋的規則,皇后可以攻擊與之處在同一行或同一列或同一斜線上的棋子。n皇后問題等價於在nxn格的棋盤上放置n個皇后,任何2個皇后不放在同一行或同一類或同一斜線上。 演算法設計 用n元組x[1:n]表示n皇后問題的

dfs+回溯】hdu 2553 N皇后問題

Source :hdu 2553 N皇后問題 Problem Description 在N*N的方格棋盤放置了N個皇后,使得它們不相互攻擊(即任意2個皇后不允許處在同一排,同一列,也

[Swift]LeetCode51. N皇后 | N-Queens

The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other. Given an

[Swift]LeetCode52. N皇后 II | N-Queens II

The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other. Given an