一道基础c语言编程题目

 

请说一下你的基本思路吧

八皇后问题吧,百科上面有各种语言的解法.

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();	

}