您的位置:首页 > 其它

总结: 从N皇后问题里面的归纳深搜…

2016-05-19 23:15 375 查看
                                                                       
暴力枚举

(参照刘汝佳代码)

N-queens_problem-1代码 :

#include <cstdio>

#include <iostream>

#include <cstring>

using namespace std;

#define MAX 10001

int result = 0;

int c[MAX];

int n;

void search(int cur)

{

    int i,
j;

    if(cur == n)
result++;

    else

    {

  
   
 for(i = 0; i < n;
++i)  //将皇后逐行放置

  
   
 {

  
   
   
 int ok = 1;

  
   
   
 c[cur] = i; 
//第cur行的皇后放在第i列

  
   
   
 for(j = 0; j < cur;
++j)   //检查皇后冲突 纵向,两条对角线

  
   
   
 {

  
   
   
   
 if(c[cur] == c[j] || cur-c[cur] == j-c[j] ||
cur+c[cur] == j+c[j])

  
   
   
   
 {

  
   
   
   
   
 ok = 0;

  
   
   
   
   
 break;

  
   
   
   
 }

  
   
   
 }

  
   
   
 if(ok) search(cur+1);

  
   
 }

  
 }  
 

}

int main()

{

//  
 memset(c,0,sizeof(c));

    n = 8;

    

  
 search(0);

  
 printf("%d\n",result);

    

    return
0;

}

 

N-queens_problem-2代码 :

#include <cstdio>

#include <iostream>

#include <cstring>

using namespace std;

#define MAX 1001

int vis[3][MAX];

int n;

int c[MAX];

int result = 0;

void search(int cur)

{

    int i,
j;

    if(cur == n)
result++;  //记录结果  需要可以打印每一个结果
例如:(1,3,0,2)

    else

    {

  
   
 for(i = 0; i < n; ++i)

  
   
 {

  
   
   
 if(!vis[0][i] &&
!vis[1][cur+i] &&
!vis[2][cur-i+n])  //直接使用二维数组判断冲突

  
   
   
 {

  
   
   
 //  
 c[cur] = i;  
//需要打印结果加上

  
   
   
   
 vis[0][i] = vis[1][cur+i] = vis[2][cur-i+n] =
1;

  
   
   
   
 search(cur+1);

  
   
   
   
 vis[0][i] = vis[1][cur+i] = vis[2][cur-i+n] =
0;

  
   
   
 }

  
   
 }

    }

}

int main()

{

  
 memset(vis,0,sizeof(vis));

    result =
0;

    n = 8;

    

  
 search(0);

  
 printf("%d\n",result);

    

    return
0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: