1. 程式人生 > >C語言筆記--四皇后

C語言筆記--四皇后

四皇后是八皇后的衍生版本,其原理都是一樣的。八皇后說的是在8×8的國際棋盤上擺放8個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法?八皇后一共有92種解法。而四皇后是在一個4×4的棋盤上擺放4個皇后。

分析:

1.皇后是每行放置一個,所以每行是不會發生衝突的

2.判斷位置是否安全依賴於該位置的列、副對角線、主對角線

3.如果遍歷所有列數都找不到合適位置,即說明上一個皇后需要重新放置

關係如下:

#include<stdio.h>
#include<stdlib.h>
#define M 4
int queue[M] = { -1 };//用來儲存4個皇后的列數
int count = 0;//方法總數
int issafe(int row, int column)//用於判斷該位置是否安全
{
	for (int i = 0; i<row; i++)//遍歷前面放置了皇后的行
	{
		if (queue[i] == column)return 0;//同一列不安全
		if ((row - i) == (column - queue[i]))return 0;//同一主對角線,行之差和列之差相等
		if ((row - i) + (column - queue[i])==0)return 0;//副對角線,行之差列之差的和為0
	}
	return 1;
}

void pickqueue(int num)
{
	for (int i = 0; i<M; i++)//遍歷所有列數,找出能放的列
	{
		if (issafe(num, i))//判斷當前皇后放在哪列式安全的
		{
			queue[num] = i;//儲存當前列數
			if (num == 3)//滿4個皇后
			{
				count++;
				for (int j = 0; j < M; j++)
				{
					printf("%3d", queue[j]);
				}
				printf("\n");
			}	
			int next = num + 1;
			pickqueue(next);//下一個皇后
		}
	}
	//遍歷完所有列數後都找不到位置,即說明上一個皇后需要重新放置
	if (num==0)//若到退到0列都找不到合適位置,即返回
	{
		return;
	}
	else
	{
		queue[--num]=-1;//上一個皇后列數清除
	}
}
void main()
{
	pickqueue(0);//第一個皇后
	printf("總數為:%d", count);
	system("pause");
}

八皇后是一樣的,只需把皇后數改為8。