Editorial for Trò chơi con rắn

Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.


Submitting an official solution before solving the problem yourself is a bannable offence.

Ý tưởng:

Thực hiện theo trình tự dãy thao tác đã cho các quy tắc nêu trong đề bài:
  • Nếu đầu con rắn vượt ra ngoài màn hình, trò chơi kết thúc.
  • Nếu đầu con rắn đi vào ô có quả táo, chiều dài con rắn tăng lên.
  • Nếu mình con rắn cùng ô với đầu con rắn (con rắn tự cắn), trò chơi kết thúc.

Tổ chức dữ liệu:

  • A[][]: Trạng thái ban đầu của màn hình, A[i][j]=1 nếu ô (i,j) có quả táo.
  • B[][], với B[i][j] = t: con rắn bò đến ô (i,j) ở thời điểm t.
  • L: độ dài của con rắn.
  • D: Thời gian của trò chơi.

Thuật toán:

  • (r,s): Vị trí ô đầu con rắn đang bò đến (thay đổi theo hướng rẽ): r = r + dr[i]; s = s + ds[i]; int dr[] = { 0, 1, 0, -1 }; int ds[] = { 1, 0, -1, 0 };

    Nếu c == ‘L’ thì i= (i+3)%4; Nếu c==’D’ thì i=(i+1)%4;

  • Trường hợp con rắn bò ra ngoài: ( r < 0 || s < 0 || r >= N || s >= N ).

  • Trường hợp con rắn đi vào ô có quả táo: L++, A[r][s] =0;
  • Trường hợp con rắn tự cắn: D - B[r][s] <= L;

Code:

include <bits/stdc++.h>

define MAX_N 100

define MAX_TIME 10000

int dr[] = { 0, 1, 0, -1 }; int ds[] = { 1, 0, -1, 0 };

int A[MAXN][MAXN]; int B[MAXN][MAXN];

void xuat( int ans ) { printf( "%d\n", ans - 1 ); exit( 0 ); }

int main( void ) { int N, K, L, i, r, s; int D, h, LL;

scanf( "%d%d", &N, &K );

for( r = 0; r < N; ++r ) for( s = 0; s < N; ++s ) B[r][s] = -1;

for( i = 0; i < K; ++i ) { scanf( "%d%d", &r, &s ); A[--r][--s] = 1; }

D = 1; LL = 1; h = 0;

scanf( "%d", &L );

B[r = 0][s = 0] = 0; for( i = 0; i <= L; ++i ) { int Dturn = MAX_TIME + 1; char c = 'L';

if( i < L ) scanf( "%d %c", &Dturn, &c );

while( D <= Dturn ) { D++;

  r += dr[h];
  s += ds[h];

  // Vuot gioi han
  if( r < 0 || s < 0 || r >= N || s >= N )
    xuat( D );

 //An qua tao
  if( A[r][s] )
  {
    A[r][s] = 0;
    LL++;
  }

  // Tu can minh
  if( D - B[r][s] <= LL )
    xuat( D );

  // Thoi diem qua o (r,s)
  B[r][s] = D;
}

// c
if( c == 'L' )
  h = (h + 3) % 4;
else // if( c == 'D' )
  h = (h + 1) % 4;

}

return 0; }


Comments

Please read the guidelines before commenting.


There are no comments at the moment.