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)
運行結果: