Hướng dẫn giải của VO 14 Bài 1 - Truyền thuyết ở vương quốc xa rất xa


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 <bits/stdc++.h>
using namespace std;
const int dx[] = {-1, -1, 0, 1, 1, 1, 0, -1};
const int dy[] = {0, 1, 1, 1, 0, -1, -1, -1};

string a[1010], s;
int m, n, sx, sy, dist[1010][1010];
vector < pair <int,int> > q[1000100];
queue <int> id[8];

int main()
{
    cin >> m >> n >> sx >> sy;
    for (int i = 0; i < m; i++) cin >> a[i];
    cin >> s;

    memset(dist, -1, sizeof dist);
    q[0].push_back(make_pair(--sx, --sy));
    dist[sx][sy] = 0;

    for (int i = 0; i < int(s.size()); i++) id[s[i] - '1'].push(i);

    for (int day = 0; day < int(s.size()); day++)
        for (int i = 0; i < int(q[day].size()); i++)
        {
            int x = q[day][i].first, y = q[day][i].second;
            if (dist[x][y] != day) continue;

            for (int j = 0; j < 8; j++)
            {
                int nextDay = -1;
                while (!id[j].empty())
                    if (id[j].front() < day) id[j].pop();
                    else
                    {
                        nextDay = id[j].front();
                        break;
                    }

                if (nextDay < 0) continue;

                int xx = x + dx[j], yy = y + dy[j];
                if (xx >= 0 && xx < m && yy >= 0 && yy < n && a[xx][yy] == '.')
                    if (dist[xx][yy] < 0 || dist[xx][yy] > nextDay + 1)
                    {
                        dist[xx][yy] = nextDay + 1;
                        q[dist[xx][yy]].push_back(make_pair(xx, yy));
                    }
            }
        }

    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++) cout << (dist[i][j] >= 0);
        cout << "\n";
    }
}

Code mẫu của happyboy99x

#include<iostream>
#include<cstring>
#include<queue>
using namespace std;

const int L = 1e6, M = 1e3;
const int delta[8][2] = {{-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}, {-1, -1}}; 
int next[L + 1][8], d[M][M], m, n, sx, sy;
string s, mat[M];

int main() {
    ios::sync_with_stdio(false);
    cin >> m >> n >> sx >> sy; --sx; --sy;
    for(int i = 0; i < m; ++i)
        cin >> mat[i];
    cin >> s;
    int len = s.size();
    fill_n(next[len], 8, -1);
    for(int i = len - 1; i >= 0; --i) {
        copy(next[i + 1], next[i + 1] + 8, next[i]);
        next[i][s[i] - '0' - 1] = i;
    }
    memset(d, 0x3f, sizeof d);
    priority_queue<pair<int, pair<int, int> > > q;
    q.push(make_pair(0, make_pair(sx, sy))); d[sx][sy] = 0;
    while(!q.empty()) {
        int duv = -q.top().first, u = q.top().second.first, v = q.top().second.second; q.pop();
        if(duv > d[u][v]) continue;
        for(int k = 0; k < 8; ++k) if(next[duv][k] != -1) {
            int x = u + delta[k][0], y = v + delta[k][1];
            if(x >= 0 && x < m && y >= 0 && y < n && mat[x][y] != '#' && d[x][y] > next[duv][k] + 1) {
                d[x][y] = next[duv][k] + 1;
                q.push(make_pair(-d[x][y], make_pair(x, y)));
            }
        }
    }
    string res;
    for(int i = 0; i < m; ++i) {
        for(int j = 0; j < n; ++j)
            res += d[i][j] <= len ? '1' : '0';
        res += '\n';
    }
    cout << res << endl;
    return 0;
}

Code mẫu của ladpro98

program VOBOARD2;
uses    math;
type    e=record
        x,y:longint;
        end;
const   fi='';
        fo='';
        maxn=1001;
        maxQ=sqr(maxn);
        dx:array['1'..'8'] of longint = (-1,-1,0,1,1,1,0,-1);
        dy:array['1'..'8'] of longint = (0,1,1,1,0,-1,-1,-1);
var     a:array[1..maxn,1..maxn] of longint;
        m,n,u,v,l,r,layer,nq,d:longint;
        q,q2:array[0..maxQ] of e;
        check,check2:array[1..maxn,1..maxn] of boolean;
        s:ansistring;

procedure input;
var     inp:text;
        i,j:longint;
        c:char;
begin
        assign(inp,fi);reset(inp);
        readln(inp,m,n);
        readln(inp,u,v);
        for i:=1 to m do
        begin
                for j:=1 to n do
                begin
                        read(inp,c);
                        if c='#' then a[i,j]:=1;
                end;
                readln(inp);
        end;
        readln(inp,s);
        close(inp);
end;

procedure play(x,y:longint);
begin
        if (1<=x) and (x<=m) and (1<=y) and (y<=n) and (a[x,y]=0) and (not check[x,y]) then
        begin
                check[x,y]:=true;
                check2[x,y]:=true;
                inc(d);
                q2[d].x:=x;
                q2[d].y:=y;
        end;
end;

function ok(x,y:longint):boolean;
var     i:char;
        xx,yy:longint;
begin
        for i:='1' to '8' do
        begin
                xx:=x+dx[i];
                yy:=y+dy[i];
                if (1<=xx) and (xx<=m) and (1<=yy) and (yy<=n)
                and (a[xx,yy]=0) and (not check2[xx,yy]) then
                exit(true);
        end;
        exit(false);
end;

procedure bfs;
var     u:e;
        i:longint;
begin
        d:=0;
        while nq>0 do
        begin
                u:=q[l];
                l:=(l+1) mod maxQ;
                dec(nq);
                play(u.x,u.y);
                play(u.x+dx[s[layer]],u.y+dy[s[layer]]);
        end;
        for i:=1 to d do
        if ok(q2[i].x,q2[i].y) then
        begin
                r:=(r+1) mod maxQ;
                inc(nq);
                q[r]:=q2[i];
        end;
end;

procedure process;
var     i:longint;
begin
        l:=1;r:=1;
        nq:=1;
        q[1].x:=u;
        q[1].y:=v;
        for layer:=1 to length(s) do
        begin
                bfs;
                if layer<length(s) then
                for i:=1 to d do
                check[q2[i].x,q2[i].y]:=false;
        end;
end;

procedure output;
var     i,j:longint;
        oup:text;
begin
        assign(oup,fo);rewrite(oup);
        for i:=1 to m do
        begin
                for j:=1 to n do
                if check2[i,j] then write(oup,1)
                else write(oup,0);
                writeln(oup);
        end;
        close(oup);
end;

begin
        input;
        process;
        output;
end.

Code mẫu của RR

// Author: RR
// Expected score: 100

#include <bits/stdc++.h>

#define DEBUG(x) { cout << #x << " = " << x << endl; }
using namespace std;

const int MN = 1000;
const int oo = 1000111000;

int m, n, startu, startv, l;
char a[MN + 11][MN + 11], s[MN*MN + 11], tmp[MN + 11];
set< pair<int, pair<int,int> > > nodes;
int d[MN + 11][MN + 11];
int next[MN*MN + 11][10];

void readInput() {
    scanf("%d %d\n", &m, &n);
    assert(1 <= m && m <= MN && 1 <= n && n <= MN);

    scanf("%d %d\n", &startu, &startv);
    assert(1 <= startu && startu <= m && 1 <= startv && startv <= n);

    for(int i = 1; i <= m; ++i) {
        gets(tmp);
        assert(strlen(tmp) == n);

        for(int j = 1; j <= n; ++j) {
            a[i][j] = tmp[j-1];
            assert(a[i][j] == '#' || a[i][j] == '.');
        }
    }

    assert(a[startu][startv] == '.');

    gets(s);
    l = strlen(s);
    assert(1 <= l && l <= MN*MN);
    for(int i = 0; i < l; ++i)
        assert(s[i] >= '1' && s[i] <= '8');
}

void init() {
    for(int i = l; i >= 0; --i) {
        if (i == l) {
            for(int c = 1; c <= 8; ++c)
                next[i][c] = oo;
        }
        else {
            for(int c = 1; c <= 8; ++c)
                next[i][c] = next[i+1][c];
            next[i][s[i]-'0'] = i+1;
        }
    }
}

const int di[] = {0, -1, -1, 0, 1, 1, 1,  0,  -1};
const int dj[] = {0, 0,   1, 1, 1, 0, -1, -1, -1};

void solve() {
    for(int i = 1; i <= m; ++i)
        for(int j = 1; j <= n; ++j)
            d[i][j] = oo;

    d[startu][startv] = 0;
    nodes.insert(make_pair(0, make_pair(startu, startv)));
    while (!nodes.empty()) {
        int len = nodes.begin()->first;
        int u = nodes.begin()->second.first, v = nodes.begin()->second.second;
        nodes.erase(nodes.begin());
        if (len != d[u][v]) continue;

        if (len == l) continue;

        for(int dir = 1; dir <= 8; ++dir) {
            int uu = u + di[dir], vv = v + dj[dir];
            if (uu < 1 || uu > m || vv < 1 || vv > n || a[uu][vv] == '#') continue;
            if (d[uu][vv] <= next[len][dir]) continue;

            d[uu][vv] = next[len][dir];
            nodes.insert(make_pair(d[uu][vv], make_pair(uu, vv)));
        }
    }
    int cnt = 0;
    for(int i = 1; i <= m; ++i) {
        for(int j = 1; j <= n; ++j)
            if (d[i][j] <= l) {
                putchar('1');
                ++cnt;
            }
            else putchar('0');
        puts("");
    }
    cerr << cnt << " / " << m * n << endl;
}

int main() {
    readInput();
    init();
    solve();
}

Code mẫu của skyvn97

#include<cstdio>
#include<cstring>
#include<queue>
#define MAX   1010
#define FOR(i,a,b) for (int i=(a);i<=(b);i=i+1)
#define FORD(i,b,a) for (int i=(b);i>=(a);i=i-1)
#define REP(i,n) for (int i=0;i<(n);i=i+1)
#define fi   first
#define se   second
using namespace std;
typedef pair<int,int> ii;
typedef pair<int,ii> pii;
char a[MAX][MAX];
int d[MAX][MAX];
char cmd[MAX*MAX];
int next[MAX*MAX][9];
int m,n,l,sx,sy;
int dx[]={0,-1,-1,0,1,1,1,0,-1};
int dy[]={0,0,1,1,1,0,-1,-1,-1};
void init(void) {
    scanf("%d",&m);
    scanf("%d",&n);
    scanf("%d",&sx);
    scanf("%d",&sy);
    FOR(i,1,m) scanf("%s",a[i]+1);
    scanf("%s",cmd+1);
    l=strlen(cmd+1);
    REP(i,9) next[l][i]=l+1;
    FORD(i,l-1,0) {
        REP(j,9) next[i][j]=next[i+1][j];
        next[i][cmd[i+1]-48]=i+1;
    }
}
bool canmove(int x,int y) {
    if (x<1) return (false);
    if (y<1) return (false);    
    if (x>m) return (false);
    if (y>n) return (false);
    return (a[x][y]=='.');
}
void dijkstra(void) {
    priority_queue<pii,vector<pii>,greater<pii> > q;
    while (!q.empty()) q.pop();
    memset(d,0x3f,sizeof d);
    d[sx][sy]=0;
    q.push(pii(0,ii(sx,sy)));
    while (!q.empty()) {
        pii u=q.top();q.pop();
        FOR(i,1,8) if (next[u.fi][i]<=l)
            if (canmove(u.se.fi+dx[i],u.se.se+dy[i]))
                if (d[u.se.fi+dx[i]][u.se.se+dy[i]]>next[u.fi][i]) {
                    d[u.se.fi+dx[i]][u.se.se+dy[i]]=next[u.fi][i];
                    q.push(pii(next[u.fi][i],ii(u.se.fi+dx[i],u.se.se+dy[i])));
                }
    }
}
void print(void) {
    FOR(i,1,m) {
        FOR(j,1,n) {
            if (d[i][j]<=l) printf("1");
            else printf("0");
        }
        printf("\n");
    }
}
int main(void) {
    init();
    dijkstra();
    print();
    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.