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 ;
}
原文地址:https://www.cnblogs.com/misty1/p/2920152.html