N皇后问题之回溯法

来源:互联网 发布:我的世界手机版恐龙js 编辑:程序博客网 时间:2024/05/21 21:39

N皇后问题

                                                                             Time Limit:1000MS    Memory Limit:32768KB    64bit IO Format:%I64d & %I64u

 Description

在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。

Input

共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。

Output

共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
 

Sample Input

1850
 

Sample Output

19210
 

再使用DFS的时候,递归函数降不再递归调用它自身,而是返回上一层调用,我们称这种现象为回溯。

//author  :  QJS//First Edit Time:2014-08-04 13:24//Last Edit Time:2014-08-04 13:24#include <stdio.h>#include <iostream>using namespace std;int C[1000];int tot;void search(int cur);int n;int ok;int main(){while (~scanf("%d", &n) && n != 0){tot=0;search(0);//函数传进去的参数为第几行printf("%d\n", tot);}return 0;}void search(int cur){int i, j;if (cur == n){tot++;}else{for (i = 0; i < n; i++){ok = 1;C[cur] = i;//尝试将皇后放入第i列的第cur行for (j = 0; j < cur; j++){if (C[cur] == C[j] || cur - C[cur] == j - C[j] || cur + C[cur] == j + C[j])                    //因为是一行一行来放。所以不会遇到两个皇后在同一行的情况。                    //所以就只需要比较是否在同一列。而C[xx]数组里面存放值是第几列。 所以判断是否相等。                    //而cur - C[cur] == j - C[j]是比较主对角线是否有皇后                    //而 cur + C[cur] == j + C[j]是比较副对角线时候有两个皇后存在                     //大家可以自己画图就很容易明白。                {ok = 0;break;}}if (ok)//如果放置合法。则继续递归。{search(cur + 1);}}}}

这个第二种方法,效率比第一种高。完美的把回溯法表现出来。

//author  :  QJS//First Edit Time:2014-08-04 13:24//Last Edit Time:2014-08-04 13:24#include <stdio.h>#include <iostream>using namespace std;int vis[2][100];int tot;void search(int cur);int n;int ok;int main(){while (~scanf("%d", &n) && n != 0){tot=0;search(0);//函数传进去的参数为第几行printf("%d\n", tot);}return 0;}void search(int cur){    int i,j;    if(cur==n)    tot++;    else for(i=0;i<n;i++)    {        if(!vis[0][i]&&!vis[1][cur+i]&&!vis[2][cur-i+n])        {            vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=1;            //创建一个二维数组。            //vis[0][i]代表有没有相同的列。            //vis[1][cur+i]代表副对角线有没有两个皇后            //vis[2][cur-i+n]代表主对角线有没有相同的两个皇后            search(cur+1);             vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=0;//切记  一样要改回来。 这就是回溯法的关键所在。             //当你一直找一直找  找到不满足条件的时候。就是一直回溯到原来的位置。        }    }    }


0 0
原创粉丝点击