3005: 皇後問題(棧和隊列)
時間限制: 1 Sec
記憶體限制: 128 MB
送出: 6
解決: 3
題目描述
編寫一個函數,求解皇後問題:在n*n的方格棋盤上,放置n個皇後,要求每個皇後不同行、不同列、不同左右對角線。
要求:
1、皇後的個數由使用者輸入,其值不能超過20,輸出所有的解。
2、采用類似于棧求解迷宮問題的方法。
輸入
輸入一個整數n,代表棋盤的大小n*n,
輸出
将計算出的彼此不受攻擊的n個皇後的所有放置方案輸出,每種方案占一行。
樣例輸入
4
樣例輸出
2 4 1 3
3 1 4 2
提示
1、規定搜尋時每行從左向右,每列從上往下搜尋!
2、盡量采用較優算法!
3、使用棧求解!
迷失在幽谷中的鳥兒,獨自飛翔在這偌大的天地間,卻不知自己該飛往何方……
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define SizeMax 20
int N;
typedef struct
{
int data[SizeMax];
int top;
} SqStack;
SqStack *s=(SqStack*)malloc(sizeof(SqStack));
void push(SqStack *&s,int e) //入棧
{
if(s->top==SizeMax-1)return;
s->top++;
s->data[s->top]=e;
}
int check(int n) //判斷這個位置能否放置皇後
{
for(int i=0; i<n; i++)
if(s->data[i]==s->data[n]||fabs(n-i)==fabs(s->data[i]-s->data[n])) //s->data[i]==s->data[n]同行判斷
return 0; //fabs(n-i)==fabs(s->data[i]-s->data[n]對角線判斷
return 1;
}
void print(SqStack *s) //輸出
{
for(int i=0; i<=s->top; i++)
printf(i!=s->top?"%d ":"%d\n",s->data[i]+1);
}
void put(int n) //遞歸搜尋
{
int i;
if(n==N)return; //棋盤檢查完成
for(i=0; i<N; i++)
{
push(s,i); //把目前行放置皇後位置坐标入棧
if(check(n)) //判斷目前位置能否放置皇後
{
if(n==N-1)print(s); //棋盤放置完成
else put(n+1); //放置下一行的皇後
}
s->top--; //出棧
}
}
int main ()
{
scanf("%d",&N);
s->top=-1;
put(0); //從第0行開始
return 0;
}