Hướng dẫn giải của Chỉnh đồng hồ


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

const fi='';
      fo='';
      num:array[0..8] of longint=(4,3,4,3,5,3,4,3,4);
      max=262144;
var b:array[0..8,1..5] of longint;
    p,d,c,a:array[0..9] of longint;
    f:array[0..max,0..9] of longint;

procedure rf;
var i,j:longint; c:char;
begin
     assign(input,fi);
     reset(input);
     for i:=1 to 3 do
     begin
          for j:=1 to 3 do
          begin
               read(c);
               a[i*3+j-3]:=ord(c)-48;
          end;
          readln;
     end;
     close(input);
end;

procedure init;
var i:longint;
begin
     b[0,1]:=1; b[0,2]:=2; b[0,3]:=4; b[0,4]:=5;
     for i:=1 to 3 do b[1,i]:=i;
     b[2,1]:=2; b[2,2]:=3; b[2,3]:=5; b[2,4]:=6;
     for i:=1 to 3 do b[3,i]:=3*i-2;
     b[4,1]:=2; for i:=2 to 4 do b[4,i]:=i+2; b[4,5]:=8;
     for i:=1 to 3 do b[5,i]:=3*i;
     b[6,1]:=4; b[6,2]:=5; b[6,3]:=7; b[6,4]:=8;
     for i:=1 to 3 do b[7,i]:=6+i;
     b[8,1]:=5; b[8,2]:=6; b[8,3]:=8; b[8,4]:=9;
     p[0]:=1;
     for i:=1 to 9 do p[i]:=p[i-1] shl 2;
end;

procedure att(i:longint);
var j,s,k:longint;
begin
     for j:=0 to 3 do
     begin
          d[i]:=j;
          for k:=1 to num[i] do
              c[b[i,k]]:=(c[b[i,k]]+j) and 3;
          if i=8 then
          begin
               s:=0;
               for k:=0 to 8 do s:=s+d[k]*p[k];
               for k:=1 to 9 do f[s,k]:=c[k];
               f[s,0]:=0;
               for k:=0 to 8 do f[s,0]:=f[s,0]+d[k];
          end
          else att(i+1);
          for k:=1 to num[i] do
              c[b[i,k]]:=(c[b[i,k]]+4-j) and 3;
     end;
end;

procedure pr;
var i,j:longint;
begin
     init;
     att(0);
end;

procedure wf;
var re,i,j:longint; kt:boolean;
begin
     assign(output,fo);
     rewrite(output);
     re:=100;
     for i:=0 to max do
     begin
          kt:=true;
          for j:=1 to 9 do
              if (f[i,j]+a[j]) and 3<>0 then
              begin
                   kt:=false;
                   break;
              end;
          if kt and (f[i,0]<re) then re:=f[i,0];
     end;
     write(re);
     close(output);
end;

begin
     rf;
     pr;
     wf;
end.

Code mẫu của happyboy99x

#include <algorithm>
#include <bitset>
#include <cctype>
#include <cfloat>
#include <climits>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <functional>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <utility>
#include <vector>
using namespace std;

typedef pair<int, int> ii;
typedef vector<ii> vii;
typedef vector<vii> vvii;
typedef vector<int> vi;
typedef vector<vi> vvi;

#define sz(a) int((a).size())
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(c) (c).begin(), (c).end()
#define tr(c,i) for(typeof((c).begin()) i = (c).begin(), _e = (c).end(); i != _e; ++i)
#define present(c,x) ((c).find(x) != (c).end())
#define cpresent(c,x) (find(all(c),x) != (c).end())
#define rep(i,n) for(int i = 0, _n = (n); i < _n; ++i)
#define repd(i,n) for(int i = (n)-1; i >= 0; --i )
#define fo(i,a,b) for(int i = (a), _b = (b); i <= _b; ++i)
#define fod(i,a,b) for(int i = (a), _b = (b); i >= _b; --i)

#define INF 1000000000
#define N

bool vst[1<<18];
char nx[] = {0x31,0x32,0x33,0x30};
int move[9][5] = {
    {0,1,3,4,9}, {0,1,2,9,9}, {1,2,4,5,9},
    {0,3,6,9,9}, {1,3,4,5,7}, {2,5,8,9,9},
    {3,4,6,7,9}, {6,7,8,9,9}, {4,5,7,8,9}};

int hash(const char * s) {
    int res = 0;
    repd(i,9) res = res * 4 + s[i] - 0x30;
    return res;
}

int next(int s, int * a) {
    for(int i = 0; i < 5 && a[i] != 9; ++i)
        s = (s&(~(3 << (a[i]+a[i]))))|(((((s&(3<<(a[i]+a[i])))>>(a[i]+a[i]))+1)%4)<<(a[i]+a[i]));
    return s;
}

char x[10];

int main() {
    scanf("%s%s%s",x,x+3,x+6);
    queue<int> qu; qu.push(hash(x)); vst[hash(x)]=1;
    for(int step = 0; !qu.empty(); step++) {
        rep(K,qu.size()) {
            int s (qu.front()); qu.pop();
            if(s == 0) { printf("%d\n", step); return 0; }
            rep(i,9) {
                int ns = (next(s,move[i]));
                if(!vst[ns]) {
                    vst[ns] = 1;
                    qu.push(ns);
                }
            }
        }
    }
    return 0;
}

Code mẫu của ladpro98

program CLOCK;
uses    math;
const   move:array[1..9,0..5] of longint = (
        (4,1,2,4,5,0),(3,1,2,3,0,0),(4,2,3,5,6,0),(3,1,4,7,0,0),
        (5,2,4,5,6,8),(3,3,6,9,0,0),(4,4,5,7,8,0),(3,7,8,9,0,0),(4,5,6,8,9,0));
        fi='';
var     q,d:array[0..1 shl 19] of longint;
        chk:array[0..1 shl 19] of boolean;
        c:char;st:string;
        l,r,u,v,i,s:longint;
        inp:text;

function get(x,m:longint):longint;
var     i,b:longint;
begin
        for i:=1 to move[m,0] do begin
                b:=x shr (2*move[m,i]-2) and 3;
                x:=x-b*(1 shl (2*move[m,i]-2));
                x:=x+((b+1) mod 4)*(1 shl (2*move[m,i]-2));
        end;
        exit(x);
end;

begin
        assign(inp,fi);reset(inp);
        while not eof(inp) do begin
                read(inp,c);
                if c in ['0'..'3'] then st:=c+st;
        end;
        for i:=1 to 9 do s:=s*4+ord(st[i])-48;
        l:=1;r:=1;
        q[1]:=s;d[s]:=0;chk[s]:=true;
        while l<=r do begin
                u:=q[l];inc(l);
                for i:=1 to 9 do begin
                        v:=get(u,i);
                        if not chk[v] then begin
                                inc(r);
                                q[r]:=v;
                                d[v]:=d[u]+1;
                                if v=0 then begin
                                        write(d[v]);halt;
                                end;
                                chk[v]:=true;
                        end;
                end;
        end;
        write(d[0]);
end.

Code mẫu của RR

uses math;
const
  next:array['0'..'3',0..3] of char=(
('0','1','2','3'),
('1','2','3','0'),
('2','3','0','1'),
('3','0','1','2'));

var
  a:array[1..3,1..3] of char;
  kq:array[1..9] of longint;
  i,j,res:longint;

procedure update(i,j:longint);

        procedure c(u,v:longint);
        begin
          a[u,v]:=next[a[u,v],j];
        end;

    begin
      case i of
        1: begin c(1,1); c(1,2); c(2,1); c(2,2); end;
        2: begin c(1,1); c(1,2); c(1,3); end;
        3: begin c(1,2); c(1,3); c(2,2); c(2,3); end;
        4: begin c(1,1); c(2,1); c(3,1); end;
        5: begin c(1,2); c(2,1); c(2,2); c(2,3); c(3,2); end;
        6: begin c(1,3); c(2,3); c(3,3); end;
        7: begin c(2,1); c(2,2); c(3,1); c(3,2); end;
        8: begin c(3,1); c(3,2); c(3,3); end;
        9: begin c(2,2); c(2,3); c(3,2); c(3,3); end;
      end;
    end;

function check:boolean;
    var
      i,j:longint;
    begin
      for i:=1 to 3 do
      for j:=1 to 3 do
        if a[i,j]<>'0' then exit(false);
      exit(true);
    end;

procedure duyet(i,sum:longint);
    var
      j:longint;
    begin
      for j:=0 to 3 do
        begin
          kq[i]:=j;
          update(i,j);
          if i<9 then duyet(i+1,sum+j)
          else
            if check then res:=min(res,sum+j);
          if j<>0 then update(i,4-j);
        end;
    end;

begin
  for i:=1 to 3 do
    begin
      for j:=1 to 3 do read(a[i,j]);
      readln;
    end;
  res:=1000;
  duyet(1,0);
  writeln(res);
end.

Code mẫu của hieult

#include <stdio.h>
//#include <conio.h>
int d[81]={1,1,0,1,1,0,0,0,0,
1,1,1,0,0,0,0,0,0,
0,1,1,0,1,1,0,0,0,
1,0,0,1,0,0,1,0,0,
0,1,0,1,1,1,0,1,0,
0,0,1,0,0,1,0,0,1,
0,0,0,1,1,0,1,1,0,
0,0,0,0,0,0,1,1,1,
0,0,0,0,1,1,0,1,1};
long a[10],min,l,t;
void doi(int x,int y)
  {
  int i;
  for(i=1;i<=y;i++)
    a[x]=(a[x]+1)%4;
  }
void thunhan(long x)
  {
  int ok,i;
  if(x<min)
    {
    ok=1;
    for(i=1;i<=9;i++)
      if(a[i]!=0)
        {
        ok=0;
        break;
        }
    if(ok==1) min=x;
    }
  }      
void xuli(long i,long tong)
  {               
  int j,k;
  for(j=0;j<=3;j++)
    {
    tong=tong+j;
    for(k=1;k<=9;k++)
      if(d[9*(i-1)+k-1]==1)
        doi(k,j);
    if(i==9)
      thunhan(tong);
    else xuli(i+1,tong);
    tong=tong-j;
    for(k=1;k<=9;k++)
      if(d[9*(i-1)+k-1]==1)
        doi(k,4-j);              
    }
  }
main()
{
min=100000;
for(l=1;l<=3;l++)
  {
  scanf("%ld",&t);
  a[3*(l-1)+1]=t/100;
  a[3*(l-1)+3]=t%10;
  a[3*(l-1)+2]=(t/10)%10;
  }
xuli(1,0);
printf("%ld",min);
//getch();
}

Code mẫu của ll931110

program clock;
const
  input  = '';
  output = '';
  len: array[1..9] of longint = (4,3,4,3,5,3,4,3,4);
  adj: array[1..9,1..5] of longint =
((1,2,4,5,0),(1,2,3,0,0),(2,3,5,6,0),(1,4,7,0,0),
(2,4,5,6,8),(3,6,9,0,0),(4,5,7,8,0),(7,8,9,0,0),(5,6,8,9,0));
type
  arr = array[1..9] of longint;
var
  a,b,list: arr;
  fi,fo: text;
  res: longint;

procedure openfile;
begin
  assign(fi, input);  reset(fi);
  assign(fo, output);  rewrite(fo);
end;

procedure closefile;
begin
  close(fo); close(fi);
end;

procedure init;
var
  i,j: longint;
  ch: char;
begin
  for i := 1 to 3 do
    begin
      for j := 1 to 3 do
        begin
          read(fi, ch);
          a[(i - 1) * 3 + j] := ord(ch) - ord('0');
        end;
      readln(fi);
    end;
end;

operator <(x,y: arr) c: boolean;
var
  i: longint;
begin
  c := false;
  for i := 1 to 9 do
    if x[i] <> y[i] then
      begin
        c := x[i] > y[i];
        exit;
      end;
end;

procedure update;
var
  i,j,ss: longint;
begin
  b := a;
  for i := 1 to 9 do
    for j := 1 to len[i] do
      b[adj[i,j]] := (b[adj[i,j]] + list[i]) mod 4;

  for i := 1 to 9 do if b[i] <> 0 then exit;
  ss := 0;
  for i := 1 to 9 do ss := ss + list[i];
  if ss < res then res := ss;
end;

procedure att(i: longint);
var
  j: longint;
begin
  for j := 0 to 3 do
    begin
      list[i] := j;
      if i = 9 then update else att(i + 1);
    end;
end;

procedure solve;
begin
  res := 100;
  att(1);
  writeln(fo, res);
end;

begin
  openfile;
  init;
  solve;
  closefile;
end.

Code mẫu của skyvn97

#include<stdio.h>
#include<queue>
using namespace std;
queue<int> q;
int mv[9][9]={{1,1,0,1,1,0,0,0,0},{1,1,1,0,0,0,0,0,0},{0,1,1,0,1,1,0,0,0},{1,0,0,1,0,0,1,0,0},{0,1,0,1,1,1,0,1,0},{0,0,1,0,0,1,0,0,1},{0,0,0,1,1,0,1,1,0},{0,0,0,0,0,0,1,1,1},{0,0,0,0,1,1,0,1,1}};
int f;
int c[262144];
int l[262144];
void init(void) {
    int i,j;
    int a[3][3];
    char s[3];
    for (i=0;i<3;i=i+1) {
        scanf("%s",s);
        for (j=0;j<3;j=j+1) a[i][j]=s[j]-48;
    }
    int tmp=1;
    f=0;
    for (i=2;i>=0;i=i-1)
        for (j=2;j>=0;j=j-1) {
            f=f+a[i][j]*tmp;
            tmp=tmp*4;
        }           
}
int move(int s,int p) {
    int i,v;
    for (i=0;i<9;i=i+1)
        if (mv[p][i]==1) {
            v=((s|(1<<(17-2*i)))==s)*2+((s|(1<<(16-2*i)))==s);
            if (v<3) s=s+(1<<(16-2*i));
            else s=s-(3<<(16-2*i));
        }           
    return (s);
}
void BFS(void) {
    q.push(f);
    c[f]=1;
    l[f]=0;
    int x,y,i;
    while (!q.empty()) {        
        x=q.front(); q.pop();
        if (x==0) {
            printf("%d",l[x]);
            return;
        }
        for (i=0;i<9;i=i+1) {
            y=move(x,i);
            if (c[y]==0) {
                c[y]=1;
                l[y]=l[x]+1;
                q.push(y);
            }
        }
    }
    printf("-1");
}
int main(void) {
    init();
    BFS();
    return 0;
}

Code mẫu của khuc_tuan

#include "iostream"
#include "stdio.h"
#include "string"

using namespace std;

int a[3][3];
int ht, result;
int bit[9] = { 
    432, 448, 216, 292, 186, 73, 54, 7, 27
};

void duyet(int vt) {
    if(ht>result) return;
    if(vt==9) {
        bool ok = true;
        for(int i=0;i<3;++i) for(int j=0;j<3;++j) if(a[i][j]!=0) {
            ok = false;
            break;
        }
        if(ok) result = ht;
        return;
    }
    for(int sl=0;sl<4;++sl) {
        for(int i=0;i<3;++i) for(int j=0;j<3;++j) if( (bit[vt] & (1<<(i*3+j))) !=0  ) {
            a[i][j] = (a[i][j]+sl) % 4;
        }
        ht += sl;
        duyet(vt+1);
        ht -= sl;
        for(int i=0;i<3;++i) for(int j=0;j<3;++j) if( (bit[vt] & (1<<(i*3+j))) !=0  ) {
            a[i][j] = (a[i][j]+4-sl) % 4;
        }
    }
}

int main() {
    for(int i=0;i<3;++i) {
        string s;
        getline(cin,s);
        for(int j=0;j<3;++j) a[i][j] = s[j] - '0';
    }
    ht = 0;
    result = 100000;
    duyet(0);
    printf("%d\n",result);
    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.