zoukankan      html  css  js  c++  java
  • CODE[VS] 1295 N皇后问题

    题目描述 Description

    在n×n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于再n×n的棋盘上放置n个皇后,任何2个皇后不妨在同一行或同一列或同一斜线上。

    输入描述 Input Description

     给定棋盘的大小n (n ≤ 13)

    输出描述 Output Description

     输出整数表示有多少种放置方法。

    样例输入 Sample Input

    8

    样例输出 Sample Output

    92

    数据范围及提示 Data Size & Hint

    n<=13

    (时限提高了,不用打表了)


    N皇后问题这个题为了可以使用DFS,把时间宽限到了2S钟,如此就可以愉快的使用DFS了,一个比较简单的DFS,很多人都是用一维数组做的,我使用二维数组做的,代码如下:
    /*************************************************************************
        > File Name: N皇后问题.cpp
        > Author: zhanghaoran
        > Mail: chilumanxi@gmail.com 
        > Created Time: 2015年07月17日 星期五 16时35分22秒
     ************************************************************************/
    
    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstring>
    #include <math.h>
    using namespace std;
    
    int n;
    int temp = 0;
    int map[14][14];
    int ans = 0;
    
    int check(int num, int x){
    	for(int i = 1; i <= n; i ++){
    		if(map[i][x] || map[num][i])
    			return 0;
    	}
    	for(int i = 1; num - i > 0 && x - i > 0; i ++){
    		if(map[num - i][x - i])
    			return 0;
    	}
    	for(int i = 1; num + i <= n && x + i <= n; i ++){
    		if(map[num +i][x + i])
    			return 0;
    	}
    	for(int i = 1; num + i <= n && x - i > 0; i ++){
    		if(map[num + i][x - i])
    			return 0;
    	}
    	for(int i = 1; num - i > 0 && x + i <= n; i ++){
    		if(map[num - i][x + i])
    			return 0;
    	}
    	return 1;
    }
    
    /*
    int check(int num, int x){
    	for(int i = 1; i <= num; i ++){
    		if(map[i][x])
    			return 0;
    		for(int j = 1; j <= 13; j ++){
    			if(map[i][j]){
    				if(fabs(i - num) - fabs(j - x) == 0){
    					return 0;
    				}
    				else 
    					break;
    			}
    		}
    	}
    	return 1;
    }
    */
    void dfs(int num){
    	if(num == n + 1){
    		ans ++;
    		return ;
    	}
    
    	for(int i = 1; i <= n; i ++){
    		if(check(num, i)){
    			map[num][i] = 1;
    			dfs(num + 1);
    			map[num][i] = 0;
    		}
    	}
    	return ;
    }
    
    int main(void){
    	memset(map, 0, sizeof(map));
    	cin >> n;
    	dfs(1);
    	cout << ans << endl;
    	return 0;
    }


    其中我一开始写的时候写的就是不含注释内的代码,然后想可不可以让代码简单一点,但是发现如注释那种写法的话就会让时间超时,所以还是采用原来的方法。
  • 相关阅读:
    洛谷 P3384 【模板】树链剖分
    codevs 4633 [Mz]树链剖分练习
    看一个人的回答有感(怎么判断数组中有没有未定义的值,如:[,,1,,3])
    bzoj2754: [SCOI2012]喵星球上的点名
    bzoj4456: [Zjoi2016]旅行者
    bzoj4574:Zjoi2016线段树 dp
    bzoj4455: [Zjoi2016]小星星
    bzoj4516: [Sdoi2016]生成魔咒
    uoj#207. 共价大爷游长沙
    bzoj4530:[Bjoi2014]大融合
  • 原文地址:https://www.cnblogs.com/chilumanxi/p/5136113.html
Copyright © 2011-2022 走看看