UVA 167 - The Sultan's Successors

八王后問題,回溯算法
代碼如下:
#include <bits/stdc++.h>

using namespace std;

int number=0,x[10],y[100][10];
void D()//存儲王后位置  
{
    for(int i=1; i<=8; i++)
        y[number][i]=x[i];
    number++;
}

int C(int n)
{
    return n<0?(-n):n;
}

bool B(int n)//判斷王后位置是否合理  
{
    for(int i=1; i<n; ++i)
        if(x[i]==x[n]||C(x[i]-x[n])==(n-i))
            return false;
    return true;
}

void A(int n)//回溯王后位置  
{
    for(int i=1; i<=8; ++i)
    {
        x[n]=i;
        if(B(n))
        {
            if(!(n-8))
                D();
            else
                A(n+1);
        }
    }
}

int main()
{
    A(1);
    int i,j,k,n,Max,sum,z[10][10];
    cin>>n;
    for(i=1; i<=n; ++i)
    {
        for(j=0; j<8; ++j)
            for(k=0; k<8; ++k)
                cin>>z[j][k];
        Max=0;
        for(j=0; j<number; ++j)
        {
            sum=0;
            for(k=1; k<=8; ++k)
                sum+=z[k-1][y[j][k]-1];
            Max=max(Max,sum);
        }
        cout<<setw(5)<<Max<<endl;
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章