N皇后問題
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5563 Accepted Submission(s): 2518
Problem Description在N*N的方格棋盤放置了N個皇后,使得它們不相互攻擊(即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。
你的任務是,對於給定的N,求出有多少種合法的放置方法。
Input共有若干行,每行一個正整數N≤10,表示棋盤和皇后的數量;如果N=0,表示結束。
Output共有若干行,每行一個正整數,表示對應輸入行的皇后的不同放置數量。
Sample Input
1850
Sample Output
19210#include<iostream>using namespace std;#include"stdio.h"#define MAX 12int vst[MAX]; int cnt[MAX];int ans;int n;bool flag;//vst[i] 表示第i個皇后的列數//ans 存放的是當前方案的個數,用於複製給ans[i],n表示皇后迴圈個數的變數//flag用來表示該位置能不能放皇后,能的話就為truevoid DFS(int row) //深搜 { int i,j; if(row==n+1) //如果所放皇后個數大於要求個數n,則該方案可行,ans+1 ans++; else for(i=1;i<=n;i++)//該皇后之前的也需要進行迴圈,先選定一個位置看下面能放幾個,如果不夠,這個也要換 { flag=true; vst[row]=i; for(j=1;j<row;j++) //將該皇后之前的各個皇后都與之進行比較,看是否滿足條件 { if(vst[row]==vst[j]||vst[row]-row==vst[j]-j||vst[row]+row==vst[j]+j) // {//如果在同一斜線或同一列就不能放 flag=false; break; } } if(flag) DFS(row+1);// 如果能放,考慮放置下一個皇后,row+1 } }int main(){ int i; for(n=1;n<11;n++)//´從1~10先算出各個方案,下面直接輸出 { ans=0; DFS(1);//每次都是從1開始搜尋 cnt[n]=ans;// cnt[i]表示放i個皇后的可行方案個數 } while(scanf("%d",&n)!=EOF&&n) { printf("%d\n",cnt[n]); } return 0;}