Hướng dẫn giải của Những ngôi nhà


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.

Lưu ý: Các code mẫu dưới đây chỉ mang tính tham khảo và có thể không AC được bài tập này

Code mẫu của flashmt

var m,n:byte;
    dem:integer;
    b:array[1..100] of byte;
    a:array[0..25] of byte;

procedure rf;
var i,j:byte;
begin
     readln(m,n);
     j:=0;
     for i:=1 to n do
     begin
          read(a[i]);
          j:=j+a[i];
     end;
     a[0]:=m-j;
     m:=n+a[0];
     if m=n then
        for i:=1 to n do b[i]:=i
     else
     begin
          b[1]:=1;
          for i:=2 to 1+a[0] do b[i]:=0;
          for j:=2 to n do b[a[0]+j]:=j;
     end;
end;

procedure writef;
var i,j:byte;
begin
     for i:=1 to m do
         if b[i]=0 then write(0,' ')
         else for j:=1 to a[b[i]] do write(b[i],' ');
     writeln;
end;

procedure swap(var a,b:byte);
var t:byte;
begin
     t:=a; a:=b; b:=t;
end;

procedure pr;
var i,j,l,r:byte;
begin
     dem:=0;
     repeat
           inc(dem);
           writef;
           if dem=1000 then halt;
           i:=m-1;
           while (i>0) and (b[i]>=b[i+1]) do dec(i);
           if i>0 then
           begin
                j:=m;
                while (j>i) and (b[j]<=b[i]) do dec(j);
                swap(b[i],b[j]);
                l:=i+1; r:=m;
                while l<r do
                begin
                     swap(b[l],b[r]);
                     dec(r);
                     inc(l);
                end;
           end;
     until i=0;
end;

begin
     rf;
     pr;
end.

Code mẫu của ladpro98

program houses;
uses    math;
const   maxN=22;
        maxL=111;
        fi='';
var     a:array[0..maxn] of longint;
        f:array[1..maxL] of longint;
        check:array[1..maxN] of boolean;
        l,n,res,sum:longint;

procedure input;
var     inp:text;
        i:longint;
begin
        assign(inp,fi);
        reset(inp);
        readln(inp,l,n);
        for i:=1 to n do
        begin
                read(inp,a[i]);
                inc(sum,a[i]);
        end;
        a[0]:=1;
        close(inp);
end;

procedure output;
var     i,j:longint;
begin
        i:=1;
        while i<=l do
        begin
                if f[i]<>0 then
                for j:=1 to a[f[i]] do
                        write(f[i],' ')
                else
                write(f[i],' ');
                inc(i,a[f[i]]);
        end;
        writeln;
end;

procedure back(i,s:longint);
var     j:longint;
begin
        if i>l then
        begin
                inc(res);
                if res>1000 then halt;
                output;
                exit;
        end;
        if (i>1) and ((sum-s)<=(l-i)) then
        begin
                f[i]:=0;
                back(i+1,s);
        end;
        for j:=1 to n do
        if not check[j] then
        begin
                check[j]:=true;
                f[i]:=j;
                back(i+a[j],s+a[j]);
                check[j]:=false;
        end;
end;

begin
        input;
        back(1,0);
end.

Code mẫu của RR

//Written by Nguyen Thanh Trung
{$R+,Q+}
uses math;
const
  FINP='';
  FOUT='';
  MAXN=100;
var
  f1,f2:text;
  sum,n,l:longint;
  kq,len:array[1..MAXN] of longint;
procedure openF;
begin
  assign(f1,FINP); reset(f1);
  assign(f2,FOUT); rewrite(f2);
end;
procedure closeF;
begin
  close(f1); close(f2);
end;
procedure inp;
var
  i:longint;
begin
  read(f1,l,n); sum:=0;
  for i:=1 to n do
    begin
      read(f1,len[i]);
      sum+=len[i];
    end;
  kq[1]:=1; sum:=l-sum; for i:=sum+1 downto 2 do kq[i]:=0;
  for i:=2 to n do
    kq[sum+i]:=i;
end;
procedure print;
var
  i,j:longint;
begin
  for i:=1 to n do
    if kq[i]=0 then write(f2,'0 ')
    else for j:=1 to len[kq[i]] do write(f2,kq[i],' ');
  writeln(f2);
end;
procedure swap(var a,b:longint);
var
  temp:longint;
begin
  temp:=a; a:=b; b:=temp;
end;
procedure sort(l,r:longint);
var
  i,j,mid:longint;
begin
  i:=l; j:=r; mid:=kq[l+random(r-l+1)];
  repeat
    while kq[i]<mid do inc(i);
    while kq[j]>mid do dec(j);
    if i<=j then
      begin
        swap(kq[i],kq[j]);
        inc(i); dec(j);
      end;
  until i>j;
  if i<r then sort(i,r);
  if l<j then sort(l,j);
end;
procedure solve;
var
  count,i,vt,j,luu:longint;
  found:boolean;
begin
  n+=sum; count:=0;
  repeat
    print; inc(count); if count=1000 then break;
    found:=false;
    for vt:=n-1 downto 1 do
      if kq[vt]<kq[vt+1] then break;
    if kq[vt]<kq[vt+1] then
      begin
        found:=true;
        luu:=vt+1;
        for j:=vt+2 to n do
          if (kq[j]>kq[vt]) and (kq[j]<kq[luu]) then luu:=j;
        swap(kq[vt],kq[luu]);
        if vt<n then sort(vt+1,n);
      end;
  until not found;
end;
begin
  openF;
  inp;
  solve;
  closeF;
end.

Code mẫu của hieult

#include <stdio.h>
#include <stdlib.h>
//#include <conio.h>
long l,n,spt,dem=0,a[21],d[101],m[101],i,j,tong;
void thunhan()
 {
 long i,j;
 dem++;
 for(i=1;i<=spt;i++)
   {
   if(m[i]==0) 
     printf("0 ");
   else
     for(j=1;j<=a[m[i]];j++)
       printf("%ld ",m[i]);
   }
 printf("\n");
 if(dem==1000) 
   exit(0);
 }
void tim(long i,long x)
 {
 long j,k;
 for(j=0;j<=n;j++)
   {
   if(j==0)
     {
     if(i!=1)
       {  
       if(spt-i>=x)
         {
         m[i]=0;
         if(i==spt)
         thunhan();
         else tim(i+1,x);
         }
       }
     }
   else if(d[j]==0)
     {
     m[i]=j;
     d[j]=1;
     x=x-1; 
     if(i==spt)
       thunhan();
     else tim(i+1,x);
       x=x+1;
     d[j]=0;
     }
   }  
}
main()
{
scanf("%ld %ld",&l,&n);
for(i=1;i<=n;i++)
  {
  scanf("%ld",&a[i]);
  tong =tong+a[i];
  }
spt=l-tong+n;
tim(1,n);
//getch();
}

Code mẫu của ll931110

Program HOUSES;
        Const
                input  = '';
                output = '';
        Var
                                  a: array[1..20] of integer;
                                  b: array[1..100] of integer;
                                  d: array[0..20] of boolean;
                l,n,request,count,s: integer;
                              fi,fo: text;

Procedure openfile;
          Begin
                Assign(fi, input);
                        Reset(fi);

                Assign(fo, output);
                        Rewrite(fo);
          End;

Procedure init;
          Var
                i: integer;
          Begin
                Readln(fi, l, n);
                For i:= 1 to n do read(fi, a[i]);

                count:= 1;
                request:= n;

                s:= 0;
                For i:= 1 to n do s:= s + a[i];
                Fillchar(d, sizeof(d), true);
          End;

Procedure printresult;
          Var
                i: integer;
          Begin
                If b[1] <> 0 then
                        Begin
                                For i:= 1 to l do write(fo, b[i], ' ');
                                Writeln(fo);
                                inc(count);
                        End;
          End;

Procedure attempt(i: integer);
          Var
                j,k,t: integer;
          Begin
                If count = 1001 then exit;
                If i = 1 then t:= 1 else t:= 0;

                For k:= t to n do
                    if d[k] then
                       If k = 0 then
                          Begin
                                b[i]:= 0;
                                If (i = l) and (request = 0) then printresult
                                else if i <= l - s then attempt(i + 1);
                          End
                       else
                          Begin
                                If i + a[k] - 1 <= l then
                                        Begin
                                                For j:= i to i + a[k] - 1 do b[j]:= k;
                                                s:= s - a[k];
                                                dec(request);
                                                d[k]:= false;

                                                if (i + a[k] - 1 = l) and (request = 0) then printresult
                                                else if i + a[k] - 1 <= l - s then attempt(i + a[k]);

                                                For j:= i to i + a[k] - 1 do b[j]:= 0;
                                                s:= s + a[k];
                                                inc(request);
                                                d[k]:= true;
                                        End;
                          End;
          End;

Procedure closefile;
          Begin
                Close(fo);
                Close(fi);
          End;

Begin
        openfile;
        init;
        attempt(1);
        closefile;
End.

Code mẫu của skyvn97

#include<stdio.h>
#define MAXN   30
#define MAXL   200
int l,n,sx,sum;
int a[MAXN];
int x[MAXL];
int cnt;
bool blt[MAXL];
bool p;
void print(void)
{
     int i;
     cnt++;
     if (!p) p=true; else printf("\n");
     for (i=1;i<l;i=i+1) printf("%d ",x[i]);
     printf("%d",x[l]);
}
void btrk(int t)
{
     if (cnt>=1000) return;
     int i,j;
     for (i=0;i<=n;i=i+1)
         {
          x[t]=i;
          if (x[1]!=0)
             {
              if (i==0)
                 {
                  if ((sum-sx)<=(l-t))
                     {
                      if (t==l) print();
                      else btrk(t+1);
                     }
                 }
              else
                  if (blt[i])
                     {
                      blt[i]=false;
                      for (j=t+1;j<a[i]+t;j=j+1) x[j]=i;
                      sx=sx+a[i];
                      if (a[i]+t-1==l) print();
                      else btrk(a[i]+t);
                      blt[i]=true;
                      sx=sx-a[i];
                     }
             }
         }
}
int main(void)
{
    cnt=0;
    int i;
    p=false;
    scanf("%d",&l);
    scanf("%d",&n);
    sum=0;
    sx=0;
    for (i=1;i<=n;i=i+1)
        {
         scanf("%d",&a[i]);
         sum=sum+a[i];
         blt[i]=true;
        }
    btrk(1);
}

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.