全国青少年信息学奥林匹克竞赛培训---pascal版“四皇后问题”

uses crt;

var a:array[1..4,1..4]of char;

procedure init;
var i,j:integer;
begin
  for i:=1 to 4 do
  begin
      for j:=1 to 4 do
      a[i][j]:='*';

  end;
end;

procedure print;
var i,j:integer;
begin

  for i:=1 to 4 do
  begin
    for j:=1 to 4 do
    write(a[i][j]:2);

  writeln();
  end;
end;

function valid(x,y:integer):boolean;
var i,j:integer;

begin

  valid:=true;
  {检查横线}
  for i:=x+1 to 4 do
     if a[i][y]='O' then valid:=false;
  for i:=1 to x-1 do
     if a[i][y]='O' then valid:=false;

  {检查纵线}
  for j:=1 to y-1 do
      if a[x][j]='O' then valid:=false;
  for j:=y+1 to 4 do
      if a[x][j]='O' then valid:=false;

  {检查斜线}
  i:=x-1;
  j:=y-1;
  while (i>=1) and (j>=1) do
  begin
       if a[i][j]='O' then valid:=false;
       i:=i-1;
       j:=j-1;
  end;//topleft

  i:=x+1;
  j:=y-1;
  while (i<=4) and (j>=1) do
  begin
       if a[i][j]='O' then valid:=false;
       i:=i+1;
       j:=j-1;
  end;//bottomleft

  i:=x-1;
  j:=y+1;
  while (i>=1) and (j<=4) do
  begin
       if a[i][j]='O' then valid:=false;
       i:=i-1;
       j:=j+1;
  end;//topright

  i:=x+1;
  j:=y+1;
  while (i<=4) and (j<=4) do
  begin
       if a[i][j]='O' then valid:=false;
       i:=i+1;
       j:=j+1;
  end;//bottomright
end;

procedure execute(row:integer);

var col:integer;

begin
  if row>=5 then
  begin
      print;
      writeln;
      exit;
  end;

  for col:=1 to 4 do
  begin
    a[row][col]:='O';
    if valid(row,col)=true then execute(row+1);
    a[row][col]:='*';

  end;//end of for

end;

procedure debug;
begin
    a[1][1]:='O';
end;

begin

  textcolor(green);
  init;

  execute(1);
  //print;

  readln;

end.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值