18124 N Queen Question
Time limit: 2000MS memory limit: 65535K
Number of submissions: 0 Number of Passes: 0
Question types: programming language: g++; GCC; Vc
Description
There are n*n chess board, asked to put N queen, asked any two queen will not kill each other, how many different ways?
Input format
Each number is T, which represents the number of case, t<=13 thereafter, one number per line N (13>=n>0)
Output format
Each case, the output corresponds to an answer
Input sample
245
Output sample
210
Author
Admin
Scau-n Queen question-backtracking. Enter N to find out how many solutions are available to place n Queens on the N*n board, which is a eight queen problem, and the topic n is also very small, time back to 2000ms, even if the complexity of the violent backtracking O (n^2) can be too. But here's an optimization tip. The Queen can attack the same column and two pieces on the diagonal, then it is definitely a row of rows, and a row and a column can only be placed in one piece. When judging the same column, open an array of row[maxn+5] to mark which columns are placed in the Queen. For two diagonal lines, to determine if a pawn has been placed, just open another two-dimensional array diagonal[2][maxn*2+5]; Where Y-x is the main diagonal, y+x is the diagonal. But y-x may be negative, so write y-x+n; When judging the position J on the current cur line can be placed, the diagonal[0][cur-j+n] and Diagonal[1][cur+j] are marked as 1 to indicate that a piece has been placed on the diagonal of the bar.
1#include <iostream>2#include <cstdio>3#include <cstring>4#include <cstdlib>5#include <cctype>6#include <cmath>7#include <algorithm>8#include <Set>9#include <map>Ten#include <queue> One#include <stack> A#include <utility> -#include <vector> - #definell Long Long the #defineINF 0x3f3f3f3f - using namespacestd; - - introw[ -],diagonal[2][ -];//an array of marker columns and two diagonal lines + intCnt,n; - voidDfsintcur) + { A if(cur==n+1)//To reach the recursive boundary at { -cnt++; - return; - } - for(intI=1; i<=n;i++) -{//determine if a pawn is already on the column or two diagonal lines in if(!row[i]&&!diagonal[0][cur+i]&&!diagonal[1][cur-i+N]) - { torow[i]=diagonal[0][cur+i]=diagonal[1][cur-i+n]=1; +DFS (cur+1); -row[i]=diagonal[0][cur+i]=diagonal[1][cur-i+n]=0; the } * } $ }Panax Notoginseng intMain () - { the //freopen ("Input.txt", "R", stdin); +memset (Row,0,sizeof(Row)); Amemset (Diagonal,0,sizeof(diagonal)); the intT; +scanf"%d",&t); - while(t--) $ { $scanf"%d",&n); -Cnt=0; -Dfs1); theprintf"%d\n", CNT); - }Wuyi return 0; the}
18124 N Queen Question