杭电 HOJ 2553 N皇后问题 解题报告

    回溯法,经典题啊。发现很简单有木有。。。看代码~用数组保存sum值,否则会超时。杭电也够坑人的。。。

#include <iostream>

using namespace std;



int col[11],dia[21],evil[21];

int n,sum,s[11];



void DFS(int x)

{

    int i;

    if(x==n+1)

    {

        sum++;

        return;

    }

    for(i=1;i<=n;i++)

    {

        if(!col[i] && !dia[x+i] && !evil[10+i-x])

        {

            col[i]=dia[x+i]=evil[10+i-x]=1;

            DFS(x+1);

            col[i]=dia[x+i]=evil[10+i-x]=0;

        }

    }

}



int main()

{

    memset(s,0,sizeof(s));

    while(cin>>n&&n)

    {

        if(!s[n])

        {

            memset(col,0,sizeof(col));

            memset(dia,0,sizeof(dia));

            memset(evil,0,sizeof(evil));

            sum=0;

            DFS(1);

            s[n]=sum;

        }

        cout<<s[n]<<endl;

    }

}

 

你可能感兴趣的:(问题)