永发信息网

PASCAL NOIP1996复赛普及组第四题

答案:1  悬赏:80  手机版
解决时间 2021-01-28 19:39
  • 提问者网友:记得曾经
  • 2021-01-27 23:13
PASCAL NOIP1996复赛普及组第四题
最佳答案
  • 五星知识达人网友:逐風
  • 2021-01-28 00:27
以(2^2)*(2^2)为例
1 2 3 4
2 1 4 3
3 4 1 2
4 3 2 1
将其分为4个(2^1)*(2^1)的矩阵
以左上角的矩阵为例:
1 2
2 1
再将其分为4个(2^0)*(2^0)的矩阵
左上角的一个等于右下角的一个,右上角的等于左上角的+1,右上角等于左下角
再次返回到
4个(2^1)*(2^1)的矩阵
左上角的一个等于右下角的一个,右上角的等于左上角的+2,右上角等于左下角
……
总结:
当前的4个(2^n)*(2^n)的矩阵
->4个(2^(n-1))*(2^(n-1))的矩阵
左上角的一个等于右下角的一个,右上角的等于左上角的+n+1,右上角等于左下角

var i,j,k,m,n,half,s:integer;
a:array [1..64,1..64] of integer;
b:array[1..64]of boolean;
begin
readln(m);
n:=1;
for i:=1 to m do n:=n*2;
k:=1; a[1,1]:=1; half:=1;
while k<=m do
begin
for i:=1 to half do
for j:=1 to half do a[i,j+half]:=a[i,j]+half;
for i:=1 to half do
for j:=1 to half do
begin
a[i+half,j]:=a[i,j+half];
a[i+half,j+half]:=a[i,j]
end;
half:=half*2; k:=k+1
end;
for i:=2 to n do begin
write('<',i-1,'>');
fillchar(b,sizeof(b),true);
s:=0;
for j:=1 to n do
if (b[j]) then begin
write(j,'-',a[j,i]);
inc(s);
b[j]:=false;
b[a[j,i]]:=false;
if s<>n div 2 then write(',');
end;
writeln;
end;
end.
不懂请追问 望采纳追问你前面的解释我有点不懂:4个(2^0)*(2^0)的矩阵其中一个不是变成了1吗?怎么会左上角的一个等于右下角的一个,右上角的等于左上角的+1,右上角等于左下角?能否再详细讲一下,不过又想问一下:你这样子弄有什么用呢?
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯