在一个8×8格的国际象棋盘上,最多放置5个皇后就可以控制整个局面,即无论对方的棋子放在哪一个都会被吃掉请编出五个皇后的分布

来源:互联网 发布:localstorage用法 php 编辑:程序博客网 时间:2024/04/29 11:15
#include<stdio.h>
#include <fstream>
#include <map>
#include <set>


using namespace std;


#include<stdio.h>
typedef struct ctrlPoint
{
int nCount ;
set<int> value;
}CtrlPoint;


int end[5]={59,60,61,62,63};
int begin[5]={0,1,2,3,4};
CtrlPoint CtlPoint[64]={0};
bool GetNextValue(int * pData,int pos)
{
    pData[pos]++;
    if (pData[pos] <= end[pos])
        return true;
    int nNext = pos -1;
    while (nNext>=0)
    {
        pData[nNext]++;
        if (pData[nNext]<=end[nNext])
        {
            for (int i = nNext;i<pos;i++)
                pData[i+1]=pData[i]+1;
            return true ;
        }
        else 
            --nNext;
    }


    return false;
}
void GetCtrlPoint(int num,CtrlPoint *pCtrl)
{
int x = num/8;
int y = num %8;
int i =0;
int j =0;
pCtrl->nCount=0;
for (int i =0;i< 8;i++)
{
pCtrl->value.insert(x*8+i);
pCtrl->nCount++;
if (i==x)
continue;
pCtrl->value.insert(i*8+y);
pCtrl->nCount++;


}
i =x+1;
j =y+1;
for ( ;i<8&&j<8;i++,j++)
{
pCtrl->value.insert(i*8+j);
pCtrl->nCount++;
}
i =x+1;
j =y-1;
for ( ;i<8&&j>=0;i++,j--)
{
pCtrl->value.insert(i*8+j);
pCtrl->nCount++;


}
i =x-1;
j =y-1;
for ( ;i>=0&&j>=0;i--,j--)
{
pCtrl->value.insert(i*8+j);
pCtrl->nCount++;


}


i =x-1;
j =y+1;
for ( ;i>=0&&j<8;i--,j++)
{
pCtrl->value.insert(i*8+j);
pCtrl->nCount++;


}


}


bool CanCover()
{
set<int> pointSet;
for (int i =0;i<5;i++)
{
CtrlPoint pPoint=CtlPoint[begin[i]];
// for (int j =0;j<pPoint.nCount;j++)
pointSet.insert(pPoint.value.begin(),pPoint.value.end());


}


if (pointSet.size()>=64)
{
printf ("%d,%d,%d,%d,%d,total=%d \n",begin[0],begin[1],begin[2],begin[3],begin[4],pointSet.size());
return true;
}
return false;
}


int main()
{
for (int i =0;i<64;i++)
{
GetCtrlPoint(i,&CtlPoint[i]);
}
while (1)
{
CanCover();


if (!GetNextValue(begin,4))
            break;
}
getchar();
}