码迷,mamicode.com
首页 > 其他好文 > 详细

N皇后问题

时间:2016-04-23 14:42:06      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:

Problem Description
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。你的任务是,对于给定的N,求出有多少种合法的放置方法。
 
Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
 
Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
 
Sample Input
1
8
5
0
 
Sample Output
1
92
10
 
 思路:利用深搜+回溯,自己用的是二维数组,但是效率上较低。看了看网上的写法,全是用的一维数组,并且连回溯也省了,看了看,果然很巧妙
 
代码:
 

#include<stdio.h>
#include<string.h>

int n,tmp;
int map[11];//记录皇后列标

void queen(int x)
{
  int i,j,flag;
  if(x==n+1)
  {
    tmp++;
    return;
  }
  else
  {
    for(i=1;i<=n;++i)//列标
    {
      map[x]=i;
      flag=1;
      for(j=1;j<x;++j)//行标x,列标j
      {
        if(map[j]==i||i-x==map[j]-j||i+x==map[j]+j) // 注:1、i=map[x] 判断是否之前有皇后(map[j])占用该列 2、不在同一条斜线的两点的含义是行标到对角线的的距离不相等
        {
          flag=0;
          break;
        }
      }
      if(flag)
      queen(x+1);//下一层
    }
  }
}

int main()
{
  int m;
  int ans[11];
  for(n=1;n<=10;++n)
  {
    tmp=0;
    queen(1);//从第一层搜索
    ans[n]=tmp;
  }
  while(scanf("%d",&m),m)
  {
    printf("%d\n",ans[m]);
  }
  return 0;
}

 

 

深搜+回溯,但是a不过去,超时了,不过容易理解

代码:

#include <iostream>
#include<string.h>
using namespace std;
bool map[15][15];
int sum;
int n;

bool place(int x,int y){
  for(int i = 1;i <= n;i++){
    if(map[x][i] == true || map[i][y] == true)
      return false;
    //左上角
    if(x-i >= 1 && y - i >= 1 &&map[x-i][y-i] == true)
      return false;
    //右上角
    if(x-i >= 1 && y + i <= n &&map[x-i][y+i] == true)
      return false;
    //左下角
    if(x+i <= n && y - i >= 1 &&map[x+i][y-i] == true)
      return false;
    //右下角
    if(x+i <= n && y + i <= n &&map[x+i][y+i] == true)
      return false;
    }
  return true;
}

void queen(int x){
  if(x > n && n > 0){
    sum ++;
    x = 0;
  }
  else{
    for(int i = 1;i <= n;i++){
      if(place(x,i)){
        map[x][i] = true;
        queen(x+1);
        map[x][i] = false;
      }
    }

  }
}

int main()
{
  while(cin >> n){
    sum = 0;
    if(n == 0)
      break;
    queen(1);
    cout << sum << endl;
  }
  return 0;
}

N皇后问题

标签:

原文地址:http://www.cnblogs.com/2016zhanggang/p/5424482.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!