n皇后问题详解

棋盘是nxn大小的,每一行放一个皇后,皇后与皇后之间不能相互攻击(不能在同一列,不能在对角线)
核心代码:

void queen(int row)
{
	if(row>n-1)
	{
		count++;
		print();
		return;
	}
	int col;
	for(col=0;col<n;col++)
	{
		if(isDanger(row,col))
		{
			cheer[row][col]=1;
			queen(row+1);
			cheer[row][col]=0;
		}
	}

}

从第一行开始,第一行的第一列肯定能放第一个皇后(因为此时只有一个皇后),也就是在cheer[0][0]那里赋值了1,之后进入到第二列,也就是queen(row+1),进入第二列有两种情况,第一种是在col还没有循环完的情况下,isDanger()函数就可以通过了,则再进入到下一行中,如此往复;直到走完了n行,即第一个判断那里(row>n-1),此时就输出第一个走法,count++,表示这是第几个走法,之后返回,返回到哪里呢,回到以row=7的宏函数的子函数queen(8)那个函数中,也就是返回后的下一步是要清除掉row=7这一行的原来的那个走过的cheer[row][col],看看在前n-1行不变的情况下,第n行还可不可以继续有路可走,如果有,就循环往复上面的步骤;没有的话,它就要找到第n-1行,告诉他,你可不可以换种走法,因为现在的情况我已经不能再走了,第n-1行也是一样,先清除掉原有的 已经走过的那个位置,继续往后走,如果又找到了一个安全位置,之后又递归到最后一行,让他试试看,如果第n-1行走到边界了还没有路,此时第n行和第n-1行就要去找第n-2行,让他换一个安全位置呆着,如此往复,直到找到了第1行,因为第1行如果都会循环到边界的话,它已经没有上一行了,此时直接就pop掉,整个循环结束!第二种是第2行的col都循环完了,还是没有找到安全位置,此时就返回到上一行,先清除掉上一行原有的那个位置,让他重新走,直到它找到另一个安全位置呆着,再递归到下一行,让下一行走走看能不能找到一个安全位置。如此循环往复。

整个循环的结束点就是返回到了第一个位置后,col循环也遍历完了,此时就直接跳出来了。

整体思想就是,当前行如果找得到路,就依次递归下去;如果找不到路,它就去找它的上一行,让上一行改变位置,它再去找,如果它和它的上一行都已经找不到路了,它和它的上一行就去找上上一行,这样反复,直到上面所讲的找到第一行,且第一行的for循环也递归完了,那么此时整个递归就结束啦。

完整代码:

#include
#include
using namespace std;
int count=0;
int cheer[100][100]={0};
int n;
int isDanger(int row,int col)
{
	//
	int i,j;
	for(i=row,j=col;i>=0,j>=0;i--,j--)
	{
		if(cheer[i][j]==1)
			return 0;
	}
	//
	for(i=row;i>=0;i--)
	{
		if(cheer[i][col]==1)
			return  0;
	}
	//
	for(i=row,j=col;i>=0,j<n;i--,j++)
	{
		if(cheer[i][j]==1)
			return 0;
	}
	return 1;
}
void print()
{
	printf("the %dth solution is :\n",count);
	int i,j;
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			if(cheer[i][j]==1)
				printf("0");
			else
				printf("#");
		}
		printf("\n");
	}
	printf("\n");
}
void queen(int row)
{
	if(row>n-1)
	{
		count++;
		print();
		return;
	}
	int col;
	for(col=0;col<n;col++)
	{
		if(isDanger(row,col))
		{
			cheer[row][col]=1;
			queen(row+1);
			cheer[row][col]=0;
		}
	}

}
int main()
{
	printf("cin the n number of queen\n");
	scanf("%d",&n);
	queen(0);
	printf("%d\n",count);
	return 0;
}

	

你可能感兴趣的:(数据结构与算法)