zoukankan      html  css  js  c++  java
  • 1310 N皇后问题

    http://www.bianchengla.com/course/cpp/practise/problem?id=1310

    今天在北航oj上看到这道N皇后问题,记得做八皇后问题还是在大一c语言课上学的,当时还没接触算法,自然不懂回溯和递归,所以对八皇后的解法也只是理解了个大概,今天做到这题,上网搜了一下具体的做法,搜到一篇讲解很详细的blog:http://blog.csdn.net/hackbuteer1/article/details/6657109

    看明白后也就觉得不难写了,要做的就是算法的优化。自己写了非递归和递归的程序,位运算那个还是要好好理解一下吧。

    非递归:

    View Code
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <iostream>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    #include <math.h>
    #include <map>
    #define  N 13
    #define  INF 1000000
    using namespace std ;
    
    int pos[N] , n ;
    
    bool check( int row , int col )
    {
        int i ;
        for ( i = 1 ; i <= n ; i++ )
        if ( pos[i] == col || abs( i - row ) == abs( pos[i] - col ))
        {
            return false ;
        }
        return true ;
    }
    
    int main()
    {
        int cas , i , j , sum ;
    
        cin>>cas ;
        while( cas-- )
        {
            cin>>n ;
            for ( i = 0 ; i <= n ; i++ )
            pos[i] = -INF ;
            i = j = 1 ;
            sum = 0 ;
            while( i <= n )
            {
                while( j <= n )
                {
                    if ( check( i , j ))
                    {
                        pos[i] = j ;
                        j = 1 ;
                        break ;
                    }
                    else
                    {
                        j++ ;
                    }
                }
                if ( pos[i] == -INF )
                {
                    if ( i == 1 )
                    break ;
                    else
                    {
                        i-- ;
                        j = pos[i] + 1 ;
                        pos[i] = -INF ;
                        continue ;
                    }
                }
                if ( i == n )
                {
                    sum++ ;
                    j = pos[i] + 1 ;
                    pos[i] = -INF ;
                    continue ;
                }
                i++ ;
            }
            cout<<sum<<endl ;
        }
        return 0 ;
    }

    递归:

    View Code
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <iostream>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    #include <math.h>
    #include <map>
    #define  N 13
    #define  INF 1000000
    using namespace std ;
    
    int pos[N] , n , sum ;
    
    bool check( int row , int col )
    {
        int i ;
        for ( i = 1 ; i < row ; i++ )
        if ( pos[i] == col || abs( i - row ) == abs( pos[i] - col ))
        return false ;
        return true ;
    }
    
    void dfs( int row )
    {
        if ( row > n )
        {
            sum++ ;
            return ;
        }
        for ( int i = 1 ; i <= n ; i++ )
        if ( check( row , i ))
        {
            pos[row] = i ;
            dfs( row + 1 ) ;
        }
    }
    
    int main()
    {
        int cas ;
    
        cin>>cas ;
        while( cas-- )
        {
            cin>>n ;
            sum = 0 ;
            dfs( 1 ) ;
            cout<<sum<<endl ;
        }
        return 0 ;
    }
  • 相关阅读:
    Windows下如何通过PLSQL连接Oracle
    Windows下安装Oracle
    Linux下安装Oracle
    Linux命令学习-top命令
    Python3下字典、字符串及列表的相互转换
    Linux下搭建Jmeter+Ant+Jenkins自动化测试框架
    Linux下利用Ant调用Jmeter脚本生成HTML测试报告
    Linux下安装Ant
    Linux下安装Jmeter
    python连接数据库
  • 原文地址:https://www.cnblogs.com/misty1/p/2920152.html
Copyright © 2011-2022 走看看