请说一下你的基本思路吧
八皇后问题吧,百科上面有各种语言的解法.
https://baike.baidu.com/item/%E5%85%AB%E7%9A%87%E5%90%8E%E9%97%AE%E9%A2%98/11053477?fr=aladdin
#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();
}
穷举遍历法,8*8的格子分别编号为1-64,然后对每个格子控制的区域初始化,比如1控制12345678,9,17,25,33,41,49,57,10,19,28,37,46,55,63,2控制那些,实际上就是从这64个数找出5个,可以控制1-64所有的数。
并非本人原创,网上找到的,希望能帮到题主。
#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();
}