用棧來求解N皇后問題
作者:何知令
完成時間:2017年5月21日
代碼:
/*
問題描述:
用棧來求解N皇后問題
作者:何知令
完成時間:2017年5月21日
*/
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int data[20];
int top;
} sqstack;
sqstack st;
void push(int col)//進棧
{
st.top++;
st.data[st.top]=col;
}
void pop()//出棧
{
st.top--;
}
int output(int k,int n)//輸出棧內所有元素
{
int i,j;
k++;
printf("第%d個解:\n",k);
for(i=0; i<n; i++)
{
for(j=0; j<st.data[i]; j++);
printf("<%d,%d> ",i,j);
for(j=n-1; j>st.data[i]; j--);
}
printf("\n");
return k;
}
int judgement()//判斷該位置是否可以排放皇后
{
int i;
for(i=0; i<st.top; i++)
if(st.data[st.top]==st.data[i]||abs(st.data[st.top]-st.data[i])==st.top-i)//如果當前皇后擺放位置與之前擺放的皇后處於同行同列或者同一斜線上則不能擺放在該位置,返回0
return 0;
return 1;
}
int placequeen(int row,int k,int n,int a[][n])//排放皇后
{
int col;
for(col=0; col<n; col++)
{
push(col);
if(judgement())
{
if(row<n-1)
k=placequeen(row+1,k,n,a);
else
{
k=output(k,n);
}
}
pop();
}
return k;
}
int main()
{
int i,j,n,k=0;
printf("皇后問題<n<20> n=");
scanf("%d",&n);
int a[n][n];
for(i=0; i<n; i++)
for(j=0; j<n; j++)
a[i][j]=0;
printf("%d皇后問題如下:\n",n);
st.top=-1;
placequeen(0,k,n,a);
return 0;
}
程序運行結果展示:
知識點總結:棧,回溯
學習心得:難~慢慢學吧