free pascal方格填数(速进,小学学的初中又忘了)20分

下图中有4行方格,这10个格子中填入0~9这10个不同的数字,每行构成一个自然数,组成4个位数各不相同的自然数,已知这4个自然数都是某个整数的平方,求出所有的填写方案。一种可行的方案:9,81,324,7056。


【输出文件】 输出文件nmber.out文件包括若干行,每一行为一种可行的方案,包括四个整数,整数之间用一个空格分隔,最后一个数据后无空格。 【输出样例】输出数据中的一行示例为: 9 81 324 7056

var
i,j,k,m,n,a1,a2,a3,a4,a11,a22,a33,a44,s:longint;
a:array[1..10] of longint;b1:boolean;
b:array[0..9] of boolean;
begin
for a11:=1 to 3 do
for a22:=4 to 9 do
for a33:=13 to 31 do
for a44:=32 to 99 do
begin
fillchar(b,sizeof(b),false);
a1:=a11*a11;
a2:=a22*a22;
a3:=a33*a33;
a4:=a44*a44;
a[1]:=a1;{分解数字}
a[2]:=a2 div 10;
a[3]:=a2 mod 10;
a[4]:=a3 div 100;
a[5]:=a3 mod 100 div 10;
a[6]:=a3 mod 10;
a[7]:=a4 div 1000;
a[8]:=a4 mod 1000 div 100;
a[9]:=a4 mod 100 div 10;
a[10]:=a4 mod 10;{分解完毕}
b1:=true;{布尔变量初赋值}
for i:=1 to 10 do
if not b[a[i]] then b[a[i]]:=true{a[i]是填入方格的数,如果未填入,就设为已填入}
else b1:=false;{填入就把临时变量设为false(有重复)}
if b1 then writeln(a1,' ',a2,' ',a3,' ',a4);{如果没重复过就输出}
end;
end.
温馨提示:内容为网友见解,仅供参考
无其他回答

free pascal方格填数(速进,小学学的初中又忘了)20分
for i:=1 to 10 do if not b[a[i]] then b[a[i]]:=true{a[i]是填入方格的数,如果未填入,就设为已填入} else b1:=false;{填入就把临时变量设为false(有重复)} if b1 then writeln(a1,' ',a2,' ',a3,' ',a4);{如果没重复过就输出} end;end.

free pascal方格填数(急~~~在线等)
剪枝1:第一行必须满足是平方数才能进入下一行。剪枝2:所填的数字不能和已经填过的数字重复。注意一下第一列能不能是0的问题。如果不会搜索回溯算法,自己学吧。

free pascal方格填数(急~~~在线等)
百度毁了我的格式...将就看吧,朴素算法..var use:array[0..9] of boolean;i,j,k,l,a,b,c,d,e,o,p,q,r:longint;begin for i:=0 to 9 do \/\/第一位的循环 begin if round(sqrt(i))<>sqrt(i) then continue; \/\/判断是不是平方 use[i]:=true; \/\/表示它用过了 ...

相似回答