c语言求解n皇后问题
问题描述:
输入一个整数n,输出对应的n皇后问题的解的个数
准备工作0:大致思路
对于n皇后问题,显然采用回溯法:逐行放置皇后,对于某一行来说,依次遍历所有位置,直到在该行找到一个合法的位置把皇后放入其中;若在该行找不到这样的合法位置,就回溯到上一行的皇后,将其继续移动,直到在当前行找到下一个合法位置。若已经到达最后一行,且找到了放置皇后的合法位置,那么解的个数加一,并再次回溯。
准备工作1:数据结构(栈)实现
由于采用迭代法而不是传统的递归法解决这个问题,算法需要我们显式地维护一个栈,而这个栈,装载了每一行放置的皇后的坐标,通过入栈与出栈,实现回溯。这个栈的结构基于双向链表,大家可以看我写的上一篇c语言实现双向链表。
话不多说,上代码:
struct Queen {
//定义皇后的坐标
int x;
int y;
};
struct ListNode {
Queen q;
ListNode* Next;
ListNode* Last;
};
struct List {
ListNode* header;
ListNode* trailer;
int _size;
};
void CreateList(List* l)//build the list
{
l->_size = 0;
l->header = (ListNode*)malloc(sizeof(ListNode));
l->trailer = (ListNode*)malloc(sizeof(ListNode));
l->header->Next = l->trailer;
l->header->Last = NULL;
l->trailer->Last = l->header;
l->trailer->Next = NULL;
}
void InsertList(List* l, Queen e)//空表,在尾节点前插入
{
ListNode* np = (ListNode*)malloc(sizeof(ListNode));
np->q.x = e.x;
np->q.y = e.y;
np->Next = l->trailer