Hướng dẫn giải của Triomino Game


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

#include <iostream>
#include <algorithm>
#include <set>
#define fr(a,b,c) for (a=b;a<=c;a++)
using namespace std;

int g[4][888];
set <int> a;

void init()
{
    int i,j;
    fr(j,1,3) g[j][1]=1;
    fr(i,2,800)
    {
        // 0
        a.clear();
        fr(j,0,i-2) a.insert(g[0][j]^g[1][i-2-j]);
        for (j=0;a.count(j)>0;j++);
        g[0][i]=j;
        // 1
        a.clear();
        fr(j,0,i-1) a.insert(g[0][j]^(j+2<=i?g[2][i-2-j]:0));
        fr(j,0,i-2) a.insert(g[0][j]^g[3][i-2-j]);
        fr(j,0,i-2) a.insert(g[1][j]^g[1][i-2-j]);
        for (j=0;a.count(j)>0;j++);
        g[1][i]=j;
        // 2
        a.clear();
        fr(j,0,i-1) a.insert(g[1][j]^(j+2<=i?g[2][i-2-j]:0));
        fr(j,0,i-2) a.insert(g[1][j]^g[3][i-2-j]);
        for (j=0;a.count(j)>0;j++);
        g[2][i]=j;
        // 3
        a.clear();
        fr(j,0,i-1) a.insert(g[1][j]^(j+2<=i?g[2][i-2-j]:0));
        fr(j,0,i-2) a.insert(g[1][j]^g[3][i-2-j]);
        for (j=0;a.count(j)>0;j++);
        g[3][i]=j;
    }
}

int main()
{
    int n,test;
    init();
    cin >> test;
    while (test--)
    {
        cin >> n;
        cout << (g[0][n]?'X':'Y') << endl;
    }
    return 0;
}

Code mẫu của RR

{$R+,Q+}
const
  FINP='';
  FOUT='';
  MAXN=801;
  oo=100;
var
  f1,f2:text;
  test,n:longint;
  g:array[0..MAXN,0..1,0..1] of longint;
  dd:array[0..oo] of longint;
procedure openF;
begin
  assign(f1,FINP); reset(f1);
  assign(f2,FOUT); rewrite(f2);
end;
procedure closeF;
begin
  close(f1); close(f2);
end;
var
  i:longint;
procedure cal1(l:longint);
begin
  fillchar(dd,sizeof(dd),0);
  for i:=0 to l-2 do
    dd[g[i,0,0] xor g[l-1-i,0,1]]:=1;
  for i:=0 to oo do
    if dd[i]=0 then begin g[l,0,0]:=i; exit; end;
end;
procedure cal2(l:longint);
begin
  fillchar(dd,sizeof(dd),0);
  for i:=0 to l-2 do
    begin
      dd[g[i,0,0] xor g[l-1-i,1,1]]:=1;
      if i>0 then dd[g[i,0,1] xor g[l-1-i,0,1]]:=1;
    end;
  for i:=0 to oo do
    if dd[i]=0 then begin g[l,0,1]:=i; exit; end;
end;
procedure cal3(l:longint);
begin
  fillchar(dd,sizeof(dd),0);
  for i:=1 to l-2 do
    begin
      dd[g[i,1,1] xor g[l-1-i,0,1]]:=1;
      dd[g[i,0,1] xor g[l-1-i,1,1]]:=1;
    end;
  for i:=0 to oo do
    if dd[i]=0 then begin g[l,1,1]:=i; exit; end;
end;
procedure init;
var
  l:longint;
begin
  g[2,0,0]:=1; g[2,0,1]:=1;
  for l:=3 to MAXN do
    begin
      cal1(l);
      cal2(l);
      cal3(l);
    end;
end;
begin
  openF;
  init;
  read(f1,test);
  for test:=1 to test do
    begin
      read(f1,n);
      if g[n,0,0]=0 then writeln(f2,'Y')
      else writeln(f2,'X');
    end;
  closeF;
end.

Code mẫu của hieult

#include <iostream>
#include <cstdio>
#include <set>
//#include <conio.h>

using namespace std;

int dx[] = {0,0,1,1};
int dy[] = {0,1,0,1};
int triomino[1000][2][2],test,n;

int main()
{
    memset(triomino,0,sizeof(triomino));
    for(int i = 1;i<=800;i++)
    {
         for(int j = 0;j<4;j++)
         {
              set <int> bo;
              set <int>::iterator it;
              if(dx[j]==0) bo.insert(triomino[i-1][1][dy[j]]);
              if(dy[j]==0) bo.insert(triomino[i-1][dx[j]][1]);
              for(int k = 0;k+2<=i;k++)
              {
                    bo.insert(triomino[k][dx[j]][1]^triomino[i-k-2][0][dy[j]]);
                    bo.insert(triomino[k][dx[j]][0]^triomino[i-k-2][1][dy[j]]);
              }
              for(int k = 0;;k++) if(bo.find(k)==bo.end())
              {
                    triomino[i][dx[j]][dy[j]]=k;
                    break;
              }
         }
    }
    scanf("%d",&test);
    for(int i = 1;i<=test;i++)
    {
         scanf("%d",&n);
         if(triomino[n][1][1]) printf("X\n");
         else printf("Y\n");
    }
   // getch();
}

Code mẫu của ll931110

program TRIOMINO;
const
  maxn = 800;
  maxv = 1000;
var
  l: array[0..maxn,0..2,0..2] of integer;
  ex: array[0..maxv] of boolean;
  res: array[0..maxn] of boolean;

procedure calc(x: integer);
var
  i,q,t: integer;
begin
  //Calc l[x,0,0]
  fillchar(ex, sizeof(ex), false);
  for i := 1 to x - 1 do
    begin
      q := l[i - 1,0,0] xor l[x - i,1,0];
      ex[q] := true;
    end;
  t := 0;
  while ex[t] do inc(t);
  l[x,0,0] := t;

  //Calc l[x,0,1]
  fillchar(ex, sizeof(ex), false);
  for i := 1 to x - 1 do
    begin
      q := l[i - 1,0,0] xor l[x - i,2,1];
      ex[q] := true;
    end;

  for i := 1 to x - 2 do
    begin
      q := l[i - 1,0,0] xor l[x - i,1,1];
      ex[q] := true;
    end;

  for i := 2 to x - 1 do
    begin
      q := l[i - 1,0,2] xor l[x - i,0,1];
      ex[q] := true;
    end;
  t := 0;
  while ex[t] do inc(t);
  l[x,0,1] := t;
  l[x,1,0] := t;
  l[x,0,2] := t;
  l[x,2,0] := t;

  //Calc l[x,1,1]
  fillchar(ex, sizeof(ex), false);
  for i := 2 to x - 2 do
    begin
      q := l[i - 1,1,0] xor l[x - i,1,1];
      ex[q] := true;
    end;

  for i := 2 to x - 1 do
    begin
      q := l[i - 1,1,0] xor l[x - i,2,1];
      ex[q] := true;
    end;

  t := 0;
  while ex[t] do inc(t);
  l[x,1,1] := t;
  l[x,2,2] := t;

  //Calc l[x,1,2]
  fillchar(ex, sizeof(ex), false);
  for i := 2 to x - 1 do
    begin
      q := l[i - 1,1,0] xor l[x - i,1,2];
      ex[q] := true;
    end;

  for i := 2 to x - 2 do
    begin
      q := l[i - 1,1,0] xor l[x - i,2,2];
      ex[q] := true;
    end;

  t := 0;
  while ex[t] do inc(t);
  l[x,1,2] := t;
  l[x,2,1] := t;
end;

procedure solve;
var
  i,j: integer;
begin
  fillchar(l, sizeof(l), 0);
  l[2,0,0] := 1;
  l[2,0,1] := 1;
  l[2,1,0] := 1;
  l[2,0,2] := 1;
  l[2,2,0] := 1;
  for i := 3 to maxn do calc(i);

  res[1] := false;
  res[2] := true;

  for i := 3 to maxn do
    if l[i,0,0] = 0 then res[i] := false else res[i] := true;
end;

procedure printresult;
var
  i,k,n: integer;
begin
  readln(k);
  for i := 1 to k do
    begin
      readln(n);
      if res[n] then writeln('X') else writeln('Y');
    end;
end;

begin
  solve;
  printresult;
end.

Code mẫu của skyvn97

#include<cstdio>
const int res[]={1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int n,c,t;
int main(void) {
    scanf("%d",&t);
    for (c=1;c<=t;c=c+1) {
        scanf("%d",&n);
        printf("%c\n",res[n-1]+'X');
    }
    return 0;
}

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.