方格填數


方格填數
如下的10個格子


填入0~9的數字。要求:連續的兩個數字不能相鄰。
(左右、上下、對角都算相鄰)
一共有多少種可能的填數方案?
請填寫表示方案數目的整數。
注意:你提交的應該是一個整數,不要填寫任何多餘的內容或說明性文字。





注意:在最開始我將設置空格轉換爲一維數組,我看似覺得思路很正確但是卻忽略了對於邊界的檢驗 
bool check(int  *a,int i)//合理性檢查
{
	if (abs(a[i] - a[i - 1]) <=1)return false;//左邊
	if (abs(a[i] - a[i - 4]) <= 1) return false;//上邊
	if (abs(a[i] - a[i - 3]) <= 1) return false;//左上
	
	return true;
}
此種算法看似正確但是卻忽略了最致命的錯誤我,由於是一維數組所以我將填充下標從1-10的空格,在下標爲4的空格,即第二行第一列的,此時他沒有左邊,他的左邊在代碼中顯示爲空,很顯然這是最致命的錯誤




這是正確的採用一維數組的解析過程,比較暴力
#include<iostream>
using namespace std;
int a[11], vis[11];
int count1;

/*採用先將所有的位置設置好,然後將其進行篩選*/
void DFS(int x)
{
	if (x>10)//所有方格填數完畢   
	{
		if (abs(a[1] - a[2])>1 && abs(a[1] - a[4])>1 && abs(a[1] - a[5])>1 && abs(a[1] - a[6])>1 &&
			abs(a[2] - a[3])>1 && abs(a[2] - a[5])>1 && abs(a[2] - a[6])>1 && abs(a[2] - a[7])>1 &&
			abs(a[3] - a[6])>1 && abs(a[3] - a[7])>1 &&
			abs(a[4] - a[5])>1 && abs(a[4] - a[8])>1 && abs(a[4] - a[9])>1 &&
			abs(a[5] - a[6])>1 && abs(a[5] - a[8])>1 && abs(a[5] - a[9])>1 && abs(a[5] - a[10])>1 &&
			abs(a[6] - a[7])>1 && abs(a[6] - a[9])>1 && abs(a[6] - a[10])>1 &&
			abs(a[7] - a[10])>1 &&
			abs(a[8] - a[9])>1 &&
			abs(a[9] - a[10])>1)
		{
			/*打印輸出每種情況*/
			for (int i = 1; i < 11; i++)
				cout << a[i] << " ";
			cout << endl;
			
			count1++;
		}
	}
	for (int i = 0; i <= 9; i++)
		if (vis[i] == 0)
		{
			vis[i] = 1;//將用過的數標記   
			a[x] = i;//填數   
			DFS(x + 1);//對下一個方格繼續填數   
			vis[i] = 0;//清除標記   
		}
}
int main()
{
	count1 = 0;
	DFS(1);
	cout << count1 << endl;
	return 0;
}



我的想法是採用動態規劃,一步一步進行求解,從第一個填空處開始,每賦值一次進行一次合法性判斷,如果不滿足,切換另一個數值,如果符合則進行遞歸

發佈了56 篇原創文章 · 獲贊 82 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章