题目:

问题描述
  给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。
输入格式
  输入的第一行为一个整数n,表示棋盘的大小。
  接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。
输出格式
  输出一个整数,表示总共有多少种放法。
样例输入
4
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
样例输出
2
样例输入
4
1 0 1 1
1 1 1 1
1 1 1 1
1 1 1 1
样例输出
0
 
思路:
1:先列出黑皇后的情况,再进入至白皇后的搜索(黑、白皇后分开写,便于回溯);
2:之前一直会出错是由于黑白皇后都在一个函数中递归,条件没设置好(烦),导致在回溯失败;
 
示例代码:

#include <stdio.h>
#define N 8

int n = 0 ;
int f[N][N] = {0};
int sum = 0;
int flag = 0;

/*同一行、同一列、对角线 为 0*/
void change(int i , int j , int k , int num[][N])
{
  int tmp = 0 ;
  int x = 0 , y = 0 ;
  /*由于是从上至下搜索,可以考虑删去对上面的处理*/
  //N = 5;
  //int arr[N][2] = {{0,-1},{0,1},{1,-1},{1,0},{1,1},};
  int arr[N][2] = {{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1},};
  for (tmp = 0 ; tmp < N ; tmp ++)
  {
    x = i + arr[tmp][0] ;
    y = j + arr[tmp][1] ;
    while(x >= 0 && y >= 0 && x < n && y < n)
    {
      num[x][y] = k;
      x += arr[tmp][0];
      y += arr[tmp][1];
    }
  }
  return ;
}

void dfs_2n(int step , int map[][N])
{
  int x = 0 , y = 0 ;
  int i = 0 , j = 0 , k = 0 ;
  int tmp[N][N] = {0};
  if (step == n )
  {
    sum ++;
    #if 0/*打印棋盘.黑皇后->2,白皇后->3*/
    printf("====================\n");
    for (x = 0 ; x < n ; x ++)
    {
      for (y = 0 ; y < n ; y ++)
        printf("%d ",f[x][y]);
      printf("\n");
    }
    #endif
    return ;
  }
  for (j = 0 ; j < n ; j ++)
  {
    if (map[step][j])
    {
      map[step][j] = 0;
      f[step][j] = 3; /*白皇后->3*/
      for (x = 0 ; x < n ; x ++)
      {
        for (y = 0 ; y < n ; y ++)
        {
          tmp[x][y] = map[x][y];
        }
      }
      change(step,j,0,tmp);
      dfs_2n( step+1 , tmp);
      map[step][j] = 1;
      f[step][j] = 1;
    }
  }
  return ;
}

void dfs_1n(int step , int map[][N])
{
  int x = 0 , y = 0 ;
  int i = 0 , j = 0 ;
  int tmp[N][N] = {0};

  if (step == n )
  {
    for (i = 0 ; i < n ; i ++)
    {
      for (j = 0 ; j < n ; j ++)
      {
        if (f[i][j] == 1)
          map[i][j] = 1;
        else
          map[i][j] = 0;
      }
    }
    dfs_2n( step%n , map);
    return ;
  }

  for (j = 0 ; j < n ; j ++)
  {
    if (map[step][j])
    {
      map[step][j] = 0;
      f[step][j] = 2;/*黑皇后->2*/
      for (x = 0 ; x < n ; x ++)
      {
        for (y = 0 ; y < n ; y ++)
        {
          tmp[x][y] = map[x][y];
        }
      }
      change(step,j,0,tmp);
      dfs_1n( step+1 , tmp);
      map[step][j] = 1;
      f[step][j] = 1;
    }
  }
  return ;
}

int main(void)
{
  int i = 0 , j = 0 ;
  int map[N][N] = {0};
  scanf("%d",&n);
  for (i = 0 ; i < n ; i ++)
  {
    for (j = 0 ; j < n ; j ++)
    {
      scanf("%d",&map[i][j]);
      f[i][j] = map[i][j];
    }
  }

  dfs_1n(0,map);

  printf("%d",sum);
  return 0;
}

BASIC-27_蓝桥杯_2n皇后问题的更多相关文章

  1. 蓝桥杯 2n皇后问题 深搜

    默认大家会了n皇后问题 基础练习 2n皇后问题   时间限制:1.0s   内存限制:512.0MB     问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和 ...

  2. 蓝桥杯 2n皇后问题

    题意: 问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白皇后都不在同一行.同一 ...

  3. 蓝桥杯练习系统—基础练习 2n皇后问题

    问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后, 使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白皇后都不在同一行. 同一列或 ...

  4. 蓝桥杯—BASIC-27 2n皇后问题(DFS)

    问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后, 使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白皇后都不在同一行. 同一列或 ...

  5. 蓝桥杯之 2n皇后问题(双层dfs,暴力)

    Description 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后 和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两 个白皇后都不在同 ...

  6. Java实现 蓝桥杯VIP 基础练习 2n皇后问题

    基础练习 2n皇后问题 时间限制:1.0s 内存限制:512.0MB 问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一 ...

  7. 方格填数--蓝桥杯---dfs

    答案:1580 相似题目:N皇后问题 注意要枚举的是什么 #include<iostream> #include<string.h> using namespace std; ...

  8. 2012年 蓝桥杯预赛 java 本科 题目

    2012年 蓝桥杯预赛 java 本科 考生须知: l  考试时间为4小时. l  参赛选手切勿修改机器自动生成的[考生文件夹]的名称或删除任何自动生成的文件或目录,否则会干扰考试系统正确采集您的解答 ...

  9. 蓝桥杯历届试题 地宫取宝 dp or 记忆化搜索

    问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能向右或向下行走. 走 ...

随机推荐

  1. TypeScript安装

    1.Installing Node.js and updating npm Updating npm----npm install npm@latest -g Installing TypeScrip ...

  2. H5技术干货

    H5技术干货 meta标签相关知识 H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 <meta name="viewport" content="width=d ...

  3. superset 安装配置

    一.配置python虚拟环境,请参考 superset依赖python3.6环境 https://www.cnblogs.com/xibuhaohao/p/9994854.html 二.安装配置sup ...

  4. C语言define 可以提高程序运行的速度

    define的优缺点 优点 提高了程序的可读性,同时也方便进行修改: 提高程序的运行效率:使用带参的宏定义既可完成函数调用的功能,又能避免函数的出栈与入栈操作,减少系统开销,提高运行效率: 3.宏是由 ...

  5. 玩转X-CTR100 l STM32F4 l 舵机控制

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 本文介绍X-CTR100控制器的舵机控制,X-CTR ...

  6. 粗略学习《Agile Guide》后的总结

    碍于个人能力极度欠佳,所以即使我大致了解了一下何谓“Agile Guide”(敏捷开发),也不很能理解其中的软件工程思想,只能大概谈一下我的理解. 我所理解的“敏捷开发”,应该是一种特殊的.相较于传统 ...

  7. 玩转树莓派:OpenHAB的入门(二)

    通过第一篇的介绍,我们现在已经安装了OpenHAB和Demo House,那么接下来我们来看一下OpenHAB是如何工作的. OpenHAB如何工作? 接下来你会在openHAB配置的共享文件夹看到s ...

  8. Skynet服务器框架(十) CentOS 防火墙设置

    引言: 今天修改了 skynet 服务器的 IP 地址(即 config 文件中的 address 和 master 两项参数,IP 与当前及其的保持一致,端口号为 2017),然后使用一个简单的客户 ...

  9. ubuntu12.04 alternate win7 双系统安装

    ubuntu alternate的安装比desktop复杂一点,因为alternate的安装过程有个步骤是检测cd-rom,如果你是刻盘安装,自然没问题,但是,现在的安装一般是将系统刻到U盘里,或者在 ...

  10. 关于FormData及其用法

    XMLHttpRequest Level 2添加了一个新的接口FormData.利用FormData对象,我们可以通过JavaScript用一些键值对来模拟一系列表单控件,我们还可以使用XMLHttp ...