首页 > 代码库 > N皇后问题--递归回溯

N皇后问题--递归回溯

著名的N皇后问题,就是先按照行一行一行的找,先找第一行,第一行找到一列能满足条件,继续找下一行,如果下一行也找到一列能满足条件,继续找下一行,一次类推,最终找到解, 但是,如果找不到的话, 就说明上一行放的位置错误, 所以回溯到上一行中,继续找下一列,如果找不到,继续回溯,大体就是这么执行找到解的。

下面是代码:

 1 #include <stdio.h> 2  3 const int MAX = 30; 4 int n; 5 int a[MAX];//保存当前列值  6 int vis1[MAX];//标记当前列  7 int vis2[MAX];//标记副对角线  8 int vis3[MAX];//标记主对角线  9 int cnt;10 void dfs(int cur)11 {12     if(cur == n)//如果找完了,打印出来 13     {14         for(int i = 0; i < n; i++)15             printf("%d ", a[i]);16         printf("\n");17         cnt++;18         return;19     }20     int i = cur + 1;//此时是按照行来找的,所以直接遍历列就行 21     for(int j = 1; j <= n; j++)22     {23         //如果列,主对角线,副对角线都满足条件,就能放 24         if(vis1[j] == 0 && vis2[i + j] == 0 && vis3[i - j + 14] == 0)25         {26             //标记 27             vis1[j] = 1;28             vis2[i + j] = 1;29             vis3[i - j + 14] = 1;30             //如果满足条件,就将当前的列值给到a数组中 31             a[cur] = j;32             //找下一列 33             dfs(cur + 1);34             //取消标记, 35             vis1[j] = 0;36             vis2[i + j] = 0;37             vis3[i - j + 14] = 0;38         }39         40     }41 }42 int main()43 {44     while(~scanf("%d", &n))45     {46         cnt = 0;47         dfs(0);48         printf("%d\n", cnt);//统计总数 49     }50     return 0;51 }

 

N皇后问题--递归回溯