【深度優先算法】深度優先算法(DFS)搜索九宮格三行數字的平方根都爲整數

1,2,3,4,5,6,7,8,9任意填入九宮格中,找出一種數字的組合,使九宮格三行數字的平方根都爲整數。(注意:這裏不是指三行數字每行數字的和,而是三個數字形成的一個三位數)
全排列出這9個數字的所有組合,正確答案一定就在全排列輸出的結果之中。因此我們對全排列加以判斷條件便可在縮小了搜索空間的情況下找到最後的答案。
C++代碼:

#include <iostream>
#include <cmath>
#define MAX 9
using namespace std;
int temp[MAX];
int visit[MAX]={0};
int L[MAX]={1,2,3,4,5,6,7,8,9};
bool checkNum(int a[]);
void dfs(int position);
void showArray(int a[], int n);
int main()
{
	dfs(0);
	return 0;
}

bool checkNum(int a[])
{
	int sum=0;
	for(int i=0; i<9; i++)
	{
		sum*=10;
		sum+=a[i];
		if((i+1)%3==0)
		{
			int tmp=int(pow(sum,0.5));
			if(tmp*tmp!=sum)
				return false;
			sum=0;
		}
	}
	return true;
}

void dfs(int position)
{
	if(position==9)
	{
		if(checkNum(temp)==true)
		{
			showArray(temp,9);
			return;
		}
	}
	for(int i=0; i<9; i++)
	{
		if(visit[i]==0)
		{
			temp[position]=L[i];
			visit[i]=1;
			dfs(position+1);
			visit[i]=0;
		}
	}
}

void showArray(int a[], int n)
{
	cout<<a[0];
	for(int i=1; i<n; i++)
		cout<<' '<<a[i];
	cout<<endl;
}

運行結果:
在這裏插入圖片描述
Python代碼:

def CheckNum(T):
    m_sum=0
    for i in range(len(T)):
        m_sum*=10
        m_sum+=T[i]
        if (i+1)%3==0:
            tmp=int(pow(m_sum,0.5))
            if tmp**2!=m_sum:
                return 0
            m_sum=0
    return 1

def dfs(position):
    if position==len(L):
        if CheckNum(temp)==1:
            print(temp)
            return
    for i in range(len(L)):
        if visit[i]==0:
            temp[position]=L[i]
            visit[i]=1
            dfs(position+1)
            visit[i]=0
            
L=[1,2,3,4,5,6,7,8,9]
visit=[0,0,0,0,0,0,0,0,0]
temp=[0]*9
dfs(0)

運行結果:
在這裏插入圖片描述

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