方格填數 全排列+你想不到的判斷 【藍橋杯真題】(c++實現)

方格填數

如下的10個格子
圖1.jpg

填入0~9的數字。要求:連續的兩個數字不能相鄰。
(左右、上下、對角都算相鄰)

一共有多少種可能的填數方案?

請填寫表示方案數目的整數。
注意:你提交的應該是一個整數,不要填寫任何多餘的內容或說明性文字。

我的思路

  • 將上圖中九個格子拆分成一維數組cav[10],左右、上下、對角關係人爲處理,比如cav[0]不能和cav[1]、cav[4]、cav[3]、cav[5]中數字相鄰。
  • 兩種算法:一、從0-9全排列填入數組,然後檢查其中是否有不滿足的條件,二、在全排列時檢查不滿足的條件,計算出結果輸出。本題展示先全排列後判斷的算法,即第一種算法。

算法展示

#include <iostream>
#include <algorithm>
using namespace std;
int cav[10]={0,1,2,3,4,5,6,7,8,9},ans = 0;
void swap(int a[],int i,int j)
{
	int st = a[i];
	a[i] = a[j];
	a[j] = st;
} 
bool check()
{
	//判斷 
	return  abs(cav[0]-cav[1])==1||
			abs(cav[0]-cav[4])==1||
			abs(cav[0]-cav[3])==1||
			abs(cav[0]-cav[5])==1||
			abs(cav[1]-cav[2])==1||
			abs(cav[1]-cav[4])==1||
			abs(cav[1]-cav[5])==1||
			abs(cav[1]-cav[6])==1||
			abs(cav[2]-cav[5])==1||
			abs(cav[2]-cav[6])==1||
			abs(cav[3]-cav[4])==1||
			abs(cav[3]-cav[7])==1||
			abs(cav[3]-cav[8])==1||
			abs(cav[4]-cav[5])==1||
			abs(cav[4]-cav[7])==1||
			abs(cav[4]-cav[8])==1||
			abs(cav[4]-cav[9])==1||
			abs(cav[5]-cav[6])==1||
			abs(cav[5]-cav[8])==1||
			abs(cav[5]-cav[9])==1||
			abs(cav[6]-cav[9])==1||
			abs(cav[7]-cav[8])==1||
			abs(cav[8]-cav[9])==1?false:true;
}
void findans(int x)//將0-9全排列填入數組 
{
	if(x == 10) 
	{
		if(check())ans++;
		return;
	} 
	//全排列填入數組 
	for(int i = x;i<=9;i++)
	{
		swap(cav,i,x);
		findans(x+1);
		swap(cav,i,x);
	} 		
}
int main()
{
	//查找數
	findans(0);//開始查找點 	
	cout<<ans<<endl;
	return 0;
}

上文鏈接:抽籤 遞歸【藍橋杯真題】(c++實現)

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