PASCAL NOIP1996普及组复赛第二题
2.输入三个自然数N,i,j(1<=i<=N,1<=j<=N),输出在一个N*N格的棋盘中,与格子(i,j)同行、同列、同一对角线的所有格子的位置。(20分)如:n=4,...
2.输入三个自然数N,i,j (1<=i<=N,1<=j<=N),输出在一个N*N格的棋盘中,与格子(i,j)同行、同列、同一对角线的所有格子的位置。(20分)
如:n=4,i=2,j=3表示了棋盘中的第二行第三列的格子,如下图:
第1行
第2行
第3行
第4行
第一列 第二列 第三列 第四列
(2,3)
当n=4,i=2,j=3时,输出的结果是:
(2,1) (2,2) (2,3) (2,4) {同一行上格子的位置}
(1,3) (2,3) (3,3) (4,3) {同列列上格子的位置}
(1,2) (2,3) (3,4) {左上到右下对角线上的格子的位置}
(4,1) (3,2) (2,3) (1,4) {左下到右上对角线上的格子的位置}
求源程序,最好讲解一下输出的第3,4行怎么来的,用PASCAL语言,谢谢了!
错了:求源程序,最好讲解一下输出的第3,4行怎么求,用PASCAL语言,谢谢了! 展开
如:n=4,i=2,j=3表示了棋盘中的第二行第三列的格子,如下图:
第1行
第2行
第3行
第4行
第一列 第二列 第三列 第四列
(2,3)
当n=4,i=2,j=3时,输出的结果是:
(2,1) (2,2) (2,3) (2,4) {同一行上格子的位置}
(1,3) (2,3) (3,3) (4,3) {同列列上格子的位置}
(1,2) (2,3) (3,4) {左上到右下对角线上的格子的位置}
(4,1) (3,2) (2,3) (1,4) {左下到右上对角线上的格子的位置}
求源程序,最好讲解一下输出的第3,4行怎么来的,用PASCAL语言,谢谢了!
错了:求源程序,最好讲解一下输出的第3,4行怎么求,用PASCAL语言,谢谢了! 展开
2个回答
展开全部
program t1;
var i,j,k,l,m,n,x,y,i1:longint;
a:array[1..10000,1..2] of longint;
procedure qsort(l,r:longint);
var i,j,x,t:longint;
begin
i:=l;
j:=r;
x:=a[(i+j) div 2,1];
repeat
while x>a[i,1] do i:=i+1;
while x<a[j,1] do j:=j-1;
if i<=j then
begin
t:=a[j,1];
a[j,1]:=a[i,1];
a[i,1]:=t;
t:=a[j,2];
a[j,2]:=a[i,2];
a[i,2]:=t;
i:=i+1;
j:=j-1;
end;
until i>j;
if i<r then qsort(i,r);
if l<j then qsort(l,j);
end;
begin
readln(n,i,j);
for x:=1 to n do
write('(',i,',',x,')');{同一行上格子的位置}
writeln;
for y:=1 to n do
write('(',y,',',j,')');{同列列上格子的位置}
writeln;
{左上到右下对角线上的格子的位置}
k:=1;
x:=i;
y:=j;
a[k,1]:=x; a[k,2]:=y;
while (x+1<=n) and (y+1<=n) do
begin
x:=x+1;
y:=y+1;
k:=k+1;
a[k,1]:=x;
a[k,2]:=y;
end;
x:=i;
y:=j;
while (x-1>=1) and (y-1>=1) do
begin
x:=x-1;
y:=y-1;
k:=k+1;
a[k,1]:=x;
a[k,2]:=y;
end;
qsort(1,k);
for i1:=1 to k do
write('(',a[i1,1],',',a[i1,2],')');
writeln;
{左下到右上对角线上的格子的位置}
k:=1;
x:=i;
y:=j;
a[k,1]:=x; a[k,2]:=y;
while (x+1<=n) and (y-1>=1) do
begin
x:=x+1;
y:=y-1;
k:=k+1;
a[k,1]:=x;
a[k,2]:=y;
end;
x:=i;
y:=j;
while (x-1>=1) and (y+1<=n) do
begin
x:=x-1;
y:=y+1;
k:=k+1;
a[k,1]:=x;
a[k,2]:=y;
end;
qsort(1,k);
for i1:=k downto 1 do
write('(',a[i1,1],',',a[i1,2],')');
writeln;
end.
望采纳
var i,j,k,l,m,n,x,y,i1:longint;
a:array[1..10000,1..2] of longint;
procedure qsort(l,r:longint);
var i,j,x,t:longint;
begin
i:=l;
j:=r;
x:=a[(i+j) div 2,1];
repeat
while x>a[i,1] do i:=i+1;
while x<a[j,1] do j:=j-1;
if i<=j then
begin
t:=a[j,1];
a[j,1]:=a[i,1];
a[i,1]:=t;
t:=a[j,2];
a[j,2]:=a[i,2];
a[i,2]:=t;
i:=i+1;
j:=j-1;
end;
until i>j;
if i<r then qsort(i,r);
if l<j then qsort(l,j);
end;
begin
readln(n,i,j);
for x:=1 to n do
write('(',i,',',x,')');{同一行上格子的位置}
writeln;
for y:=1 to n do
write('(',y,',',j,')');{同列列上格子的位置}
writeln;
{左上到右下对角线上的格子的位置}
k:=1;
x:=i;
y:=j;
a[k,1]:=x; a[k,2]:=y;
while (x+1<=n) and (y+1<=n) do
begin
x:=x+1;
y:=y+1;
k:=k+1;
a[k,1]:=x;
a[k,2]:=y;
end;
x:=i;
y:=j;
while (x-1>=1) and (y-1>=1) do
begin
x:=x-1;
y:=y-1;
k:=k+1;
a[k,1]:=x;
a[k,2]:=y;
end;
qsort(1,k);
for i1:=1 to k do
write('(',a[i1,1],',',a[i1,2],')');
writeln;
{左下到右上对角线上的格子的位置}
k:=1;
x:=i;
y:=j;
a[k,1]:=x; a[k,2]:=y;
while (x+1<=n) and (y-1>=1) do
begin
x:=x+1;
y:=y-1;
k:=k+1;
a[k,1]:=x;
a[k,2]:=y;
end;
x:=i;
y:=j;
while (x-1>=1) and (y+1<=n) do
begin
x:=x-1;
y:=y+1;
k:=k+1;
a[k,1]:=x;
a[k,2]:=y;
end;
qsort(1,k);
for i1:=k downto 1 do
write('(',a[i1,1],',',a[i1,2],')');
writeln;
end.
望采纳
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询