hduoj2553——N皇后问题,dfs回溯

hduoj 2553  dfs,回溯

N皇后问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 10297    Accepted Submission(s):
4634

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

经典题,题目卡了回溯,打表过了。。关键是要以行为单位进行深搜,把vis数组设成int型,vis为0表示可行域,vis=m>0表示在m个棋子的攻击范围内,放置棋子或移除棋子是时用增量或减量改变可行域

//题目卡了dfs,所以TLE了。。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>

using namespace std;

int map[10][10],cnt,n;

void puts(int x,int y)
{
    for(int i=0;i<n;i++){
        map[i][y]++;
        map[x][i]++;
        if(x+y-i<n&&x+y-i>=0) map[i][x+y-i]++;
        if(y-x+i<n&&y-x+i>=0) map[i][y-x+i]++;
    }
}

void remove(int x,int y)
{
    for(int i=0;i<n;i++){
        map[i][y]--;
        map[x][i]--;
        if(x+y-i<n&&x+y-i>=0) map[i][x+y-i]--;
        if(y-x+i<n&&y-x+i>=0) map[i][y-x+i]--;
    }
}

void search(int cur)
{
    if(cur==n) cnt++;
    else{
        for(int i=0;i<n;i++){
            if(map[i][cur]) continue;
            puts(i,cur);
            search(cur+1);
            remove(i,cur);
        }
    }
}

int main()
{
    while(cin>>n,n){
        cnt=0;
        memset(map,0,sizeof(map));
        search(0);
        cout<<cnt<<endl;
    }
    return 0;
}

N皇后问题_dfs

打表

时间: 2024-10-13 01:12:24

hduoj2553——N皇后问题,dfs回溯的相关文章

蓝桥杯 算法提高 8皇后&#183;改 -- DFS 回溯

  算法提高 8皇后·改   时间限制:1.0s   内存限制:256.0MB 问题描述 规则同8皇后问题,但是棋盘上每格都有一个数字,要求八皇后所在格子数字之和最大. 输入格式 一个8*8的棋盘. 输出格式 所能得到的最大数字和 样例输入 1 2 3 4 5 6 7 89 10 11 12 13 14 15 1617 18 19 20 21 22 23 2425 26 27 28 29 30 31 3233 34 35 36 37 38 39 4041 42 43 44 45 46 47 48

八皇后(dfs+回溯)

重看了一下刘汝佳的白板书,上次写八皇后时并不是很懂,再写一次: 方法1:逐行放置皇后,然后递归: 代码: #include <bits/stdc++.h>#define MAXN 8#define ll long longusing namespace std; ll ans=0;int c[MAXN]; void dfs(int cur){    if(cur==MAXN) ans++;   //***因为是逐行放置的,所以只要走到最后一行则肯定可行    else    {       

LeetCode51 N皇后——经典dfs+回溯(三段式解法)

代码如下: 1 class Solution { 2 public: 3 // record[row] 该行对应的列 4 vector<vector<string> > ans; // 结果集 5 vector<vector<string>> solveNQueens(int n) { 6 string s = ""; 7 for(int i=0; i<n; i++){ 8 s += '.'; 9 } 10 vector<in

zstu4026——DFS+回溯——八皇后

Description 在n*n(1 <= n <= 8)的棋盘上放置n个皇后,使它们互不攻击,即任意两个皇后不允许处在同一横排.同一纵列,也不允许处在同一与棋盘边框成45o角的斜线上 Input 多组测试数据,每组输入一个整数n Output 对于每组测试数据输出1行,如果没有可能做到输出No,否则在一行中输出所有皇后的位置,输出时按第1列所在行数,第2列所在行数,...输出(行的起始坐标为1),如果有多种可能,只输出行数最小的那组(即第一列行数最小的,若第一列行数最小的有多种情况,输出第二

HDU 2553 N皇后问题 --- 经典回溯

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2553 DFS+回溯 /* HDU 2553 N皇后问题 --- 经典回溯 */ #include <cstdio> #include <cstring> const int maxn = 15; int cnt, n; bool visit[3][maxn*2];//3个数组分别标记列,y+x斜线,y-x斜线是否冲突 注意要*2 /* 从第r行开始满足条件地放置皇后 r表示行(从0开

HDOJ2553-N皇后问题(DFS)

N皇后问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 12279    Accepted Submission(s): 5535 Problem Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上.你的任务是,对于给定的N,求出

poj1321——dfs回溯

POJ 1321  DFS回溯+递归枚举 棋盘问题 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24813   Accepted: 12261 Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C. Input 输入含有多组测试数据. 每组数据的第一行

CodeForces 550B Preparing Olympiad(DFS回溯)

[题目链接]:click here~~ [题目大意] 一组题目的数目(n<=15),每个题目有相应的难度,问你选择一定的题目(大于r个且小于l个)且选择后的题目里最小难度与最大难度差不小于x,求选择方案数. [解题思路]: DFS+回溯. 先发一发比较拙的代码: #include <bits/stdc++.h> using namespace std; const int N=1e5+10; int num[N],mum[N]; int n,m,q,t,l,r; int top,ans,

HDU4499 Cannon DFS 回溯的应用

题意就是给你一个n*m的棋盘,然后上面已经有了 棋子,并给出这些棋子的坐标,但是这些棋子是死的就是不能动,然后让你在棋盘上面摆炮,但是炮之间不能互相吃,吃的规则我们斗懂得 炮隔山打嘛,问你最多能放几个炮 肯定是搜索了,n,m最大才5,可能挺久没做了,对于回溯反而把握不好了,写了好久调试了好久,才过 #include <stdio.h> #include <iostream> #include <algorithm> #include <string.h> #