天天看點

YTU 3005: 皇後問題(棧和隊列)

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;
}