回 帖 发 新 帖 刷新版面

主题:toj1019--NOIP96普及组的试题

输入三个自然数,n,i,j(n<=10,1<=i<=n,1<=j<=n).n表示有一个n行n列的棋盘格子,(i,j)表示棋盘中格子的位置

如:n=4,i=2,j=3表示了棋盘中的第二行第三列的格子

要求编制一个程序,根据输入的n,i,j的值,输出与格子(i,j)在同一行、同一列、同一对角线上的所有格子位置.

例如:当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) {左下到右上对角线上的格子位置}


同一行和同一列的实现都很简单,但是斜向的输出就很难想了,不知道大家有什么好的建议或方法

回复列表 (共4个回复)

沙发

从I,J出发同加或同减一,或加一减一……

板凳

偶这个为什么错呀

var
n,p,q,i,j:longint;
begin
assign(input,'s.in');
reset(input);
assign(output,'s.txt');
rewrite(output);
while not seekeof (input) do
begin
  i:=0;j:=0;
  readln(n,p,q);
  for i:=1 to n do
    write('(',p,',',i,')');
  writeln;
  for i:=1 to n do
    write('(',i,',',q,')');
  writeln;
  i:=p;j:=q;
  while not((i=1)or(j=1))do
  begin
    i:=i-1;
    j:=j-1;
    write('(',i,',',j,')');
  end;
  write('(',p,',',q,')');
  i:=p;j:=q;
  while not((i=n)or(j=n)) do
  begin
    i:=i+1;
    j:=j+1;
    write('(',i,',',j,')');
  end;
  writeln;
  i:=p;
  j:=q;
  while not((i=n)or(j=1)) do
  begin
    i:=i+1;
    j:=j-1;
  end;
  write('(',i,',',j,')');
  while not((i=1)or(j=n)) do
  begin
    i:=i-1;

3 楼

注意观察斜线的坐标的特点,一般来说从从左上到右下的坐标都有这样的特点,即
纵坐标+坐标=i+j   从左下到右上 |纵坐标-横坐标|=|j-i|

4 楼


我的程序:
program ex;
  var
    n,i,j,k:integer;
  begin
    readln(n,i,j);
    for k:=1 to n do
      write('(',i,',',k,')',' ');
    writeln;
    for k:=1 to n do
      write('(',k,',',j,')',' ');
    writeln;
    if i<j then begin
      for k:=1 to n do
        if k+j-i<=n then
          write('(',k,',',k+j-i,')',' ');
    end
    else
      for k:=1 to n do
        if k-i+j>=1 then
          write('(',k,',',k-i+j,')',' ');
    writeln;
    for k:=n downto 1 do
      if (i+j-k>=1)and(i+j-k<=n) then
        write('(',k,',',i+j-k,')',' ');
    writeln;
  end.
[em2]

我来回复

您尚未登录,请登录后再回复。点此登录或注册