问题描述:
用栈来求解N皇后问题
作者:何知令
用栈来求解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;
}
程序运行结果展示:
知识点总结:栈,回溯
学习心得:难~慢慢学吧