hdu2553

1951 ワード

http://acm.hdu.edu.cn/showproblem.php?pid=2553
解析:テンプレートの問題ですが、うっかりTLEについてしまいましたので、表をつけるほうが安心です。
コード:
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
#define  MM -1000

int a[12];     //        
int ans[12];   //  

void init()
{
    for(int i=0;i<12;i++) a[i]=MM;
}

bool valid(int row, int col, int e)
{
    for (int i = 0; i < e; i++){
        if (a[i] == col || abs(i - row) == abs(a[i] - col))
            return false;
    }
    return true;
}

int queen(int e)
{
    int cnt = 0;
    int i = 0, j = 0;
    while (i < e){
        while (j < e){             // i         ,         
            if(valid(i, j, e))      //         
            {
                a[i] = j;        // i     
                j = 0;           // i       ,              ,     j  ,      0       
                break;
            }
            else  j++;
        }
        if(a[i] == MM){         // i              
            if (i == 0)  break;           //      ,               ,           ,    
            else {
                j = a[--i] + 1;        //              
                a[i] = MM;      //           ,    
                continue;
            }
        }
        if (i == e - 1)          //             ,        ,    
        {
            cnt++;
            j = a[i] + 1;             //                   
            a[i] = MM;           //           
            continue;
        }
        i++;
    }
    return cnt;
}

void deal()   //   ,         
{
    for(int i=1;i<11;i++){
        init();
        ans[i]=queen(i);
    }
}

int main()
{
    freopen("in.txt","r",stdin);
    deal();
    int n;
    while(scanf("%d",&n)!=EOF){
         if(n==0)  break;
         printf("%d
",ans[n]); } return 0; }