藍橋杯 8皇后及2n皇后遞歸(最簡單)的方法求解

藍橋杯 基礎訓練 2n皇后的問題

首先要理解8皇后問題
就是8*8的象棋盤上,擺8個皇后,任意兩個棋子不能在同一行,列,對角線上。
代碼:

#include<stdio.h>
int que[8]={0},Count=0;
int Check(int clown,int line)  //clown是行,line是列
{
	for(int i=0;i<line;i++)
	{
		int index=que[i];
		if(index= =clown)   //判斷是否在同一行
			return 0;
		if((clown+line)= = (i+index)) //是否在同一主對角線
			return 0;
		if((clown-line)= =(index-i))  //是否在同一副對角線
			return 0;
	}
	return 1;
}
void eight_queen(int line)//列 
{   
	for(int clown=0;clown<8;clown++)
	{
		if(Check(clown,line))
		{
			que[line]=clown;//把那一列對應的行數保存下來; 
			if(line==7)
			{
				Count++;
				que[line]=0;
				return;
			}
			eight_queen(line+1); //遞歸
			que[line]=0;
		}
	 } 
}
int main()
{
	eight_queen(0);
	printf("擺放的方式有%d種",Count);
	return 0;
}

接下來是2n皇后的問題:
給定一個 n*n 的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入 n 個黑皇后和 n 個白皇后,使任意的兩個黑皇后都不在同一行、同一列或同一條對角線上,任意的兩個白皇后都不在同一行、同一列或同一條對角線上。問總共有多少种放法?n<=8。

輸入的第一行爲一個整數 n,表示棋盤的大小。
接下來n行,每行n個數,1表示可以放置,0表示不可以放置棋子。
代碼如下:

#include<stdio.h>
#include<math.h>
int wque[8]={0};//用來標記白white皇后的行數;
int bque[8]={0};//用來標記黑black皇后
int a[10][10]={0};
int counts=0;   //總共多少種方法
int n;  //n*n格
int check(int m,int k,int b[])  //檢查是否放置在(m,k)位置是否合適
{
	int i,j;
	for(i=0;i<k;i++)
	{
		int index=b[i];
		if(index= =m)  //檢查行
			return 0;
		if((i+index)= =(m+k))  //檢查主對角線
			return 0;
		if((index-i)= =(m-k))   //檢查副對角線
			return 0;
	}
	return 1;
}
void black_queen(int k)   //放置黑皇后
{
	int i;
	if(k= =n)
	{
		counts++;
		return;
	}		
	for(i=0;i<n;i++)
	{
		if(check(i,k,bque)&& a[i][k] && (i!=wque[k]))  // 若a[i][k]=1,而且check()函數檢                查後合適,而且該位置沒有白子,就可以進行放置
		{
			bque[k]=i;
			black_queen(k+1);
			bque[k]=0;
		}
	}
	return;
}
void white_queen(int k)  //放置白皇后
{
	void black_queen(int k);
	int i,j;
	if(k==n)
	{
		black_queen(0);
		return;
	}
	
	for(i=0;i<n;i++)
	{
		if(check(i,k,wque)&&a[i][k])   //若a[i][k]=1,而且check()函數檢查後合適,就可以進行放置
		{
			wque[k]=i;
			white_queen(k+1);
			wque[k]=0;
		}
	 } 
}
int main()
{
	int i,j;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			scanf("%d",&a[i][j]);
		}
	}
	white_queen(0);   //先放置白皇后,再在白皇后程序調用黑皇后的放置程序
	printf("%d",counts);
	return 0;
}

----有1纔會有10,最終達到100。
一位學長告訴我的,非常感謝他!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章