QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#325615 | #4833. Tetra-puzzle | tuanlinh123 | 0 | 1ms | 3912kb | C++20 | 5.4kb | 2024-02-11 17:56:02 | 2024-02-11 17:56:02 |
answer
#include<bits/stdc++.h>
#define ll int
#define pll pair<ll, ll>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ld long double
using namespace std;
inline ll IDX(ll i, ll j) {return i*5+j;}
inline bool BIT(ll mask, ll i, ll j) {return (mask&1<<IDX(i, j))!=0;}
struct piece
{
ll val=0, h=0, w=0;
piece(){}
piece(char s)
{
vector <vector <bool>> a(5, vector <bool> (5, 0));
if (s=='I') a[0][0]=a[1][0]=a[2][0]=a[3][0]=1, h=4, w=1;
if (s=='L') a[0][0]=a[1][0]=a[2][0]=a[2][1]=1, h=3, w=2;
if (s=='O') a[0][0]=a[0][1]=a[1][0]=a[1][1]=1, h=w=2;
if (s=='T') a[0][0]=a[0][1]=a[0][2]=a[1][1]=1, h=2, w=3;
if (s=='Z') a[0][0]=a[0][1]=a[1][1]=a[1][2]=1, h=2, w=3;
for (ll i=0; i<5; i++)
for (ll j=0; j<5; j++)
if (a[i][j]) val|=1<<IDX(i, j);
}
inline void fdiag()
{
ll res=0;
for (ll i=0; i<5; i++)
for (ll j=0; j<5; j++)
if (BIT(val, i, j))
res|=1<<IDX(j, i);
val=res, swap(h, w);
}
inline void fhori()
{
ll res=0;
for (ll i=0; i<5; i++)
for (ll j=0; j<5; j++)
if (BIT(val, i, j))
res|=1<<IDX(4-i, j);
val=res;
}
inline void rotate()
{
fdiag();
fhori();
}
inline void fix()
{
while (1)
{
bool ok=1;
for (ll i=0; i<5; i++)
if (BIT(val, 0, i))
{ok=0; break;}
if (!ok) break;
val>>=5;
}
while (1)
{
bool ok=1;
for (ll i=0; i<5; i++)
if (BIT(val, i, 0))
{ok=0; break;}
if (!ok) break;
val>>=1;
}
}
void print()
{
cout << h << " " << w << "\n";
for (ll i=0; i<5; i++)
for (ll j=0; j<5; j++)
cout << BIT(val, i, j) << " \n"[j==4];
}
};
const ll all=(1<<25)-1, inf=1e9, cap=5000;
vector <pair<pll, pll>> best[1005];
vector <piece> I, L, O, T, Z;
ll hori[5], veri[5];
vector <ll> t[26];
struct state
{
ll val=0;
state(){}
state(ll val): val(val){}
ll evaluate(){return __builtin_popcount(val);}
bool Move(ll move)
{
if (val&move) return 0;
ll ne=val|move, re=0;
for (ll k=0; k<5; k++)
{
if ((ne|hori[k])==ne)
re|=hori[k];
if ((ne|veri[k])==ne)
re|=veri[k];
}
val=ne^re;
return 1;
}
ll findbest(ll c)
{
pll best={inf, 0};
for (ll move:t[c])
{
state ne=*this;
if (!ne.Move(move)) continue;
best=min(best, mp(ne.evaluate(), move));
}
return best.se;
}
void act(ll move)
{
for (ll i=0; i<5; i++) for (ll j=0; j<5; j++)
{
if (BIT(val, i, j)) cout << '#';
else if (BIT(move, i, j)) cout << '*';
else cout << '.'; if (j==4) cout << "\n";
}
cout << endl, Move(move);
}
};
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
for (ll i=0; i<5; i++)
for (ll j=0; j<5; j++)
{
hori[i]|=1<<IDX(i, j);
veri[j]|=1<<IDX(i, j);
}
auto init=[&](vector <piece> &a, char s)
{
a.resize(8), a[0]=piece(s);
for (ll i=1; i<8; i++)
{
if (i<4) a[i]=a[i-1], a[i].rotate();
else a[i]=a[i-4], a[i].fhori();
a[i].fix();
}
map <ll, bool> Map;
for (ll i=0; i<8; i++) for (ll j=0; j<=5-a[i].h; j++) for (ll k=0; k<=5-a[i].w; k++)
{
ll val=a[i].val<<IDX(j, k);
if (!Map[val]) Map[val]=1, t[s-'A'].pb(val);
}
}; init(I, 'I'), init(L, 'L'), init(O, 'O'), init(T, 'T'), init(Z, 'Z');
string type; cin >> type;
if (type=="prepare")
{
ll n; cin >> n;
best[0].pb({{0, 0}, {-1, -1}});
for (ll i=1; i<=n; i++)
{
string c; cin >> c;
for (ll id=0; id<best[i-1].size(); id++)
{
pair<pll, pll> s=best[i-1][id];
for (ll j=0; j<2; j++)
{
state cr(s.fi.se);
cr.Move(cr.findbest(c[j]-'A'));
best[i].pb({{cr.evaluate(), cr.val}, {id, c[j]-'A'}});
}
}
sort(best[i].begin(), best[i].end());
if (best[i].size()>cap) best[i].resize(cap);
}
string ans="";
for (ll i=n, j=0; best[i][j].se.fi!=-1; j=best[i][j].se.fi, i--)
ans=char(best[i][j].se.se+'A')+ans;
cout << ans;
}
else
{
state cr; ll n; cin >> n;
for (ll i=0; i<n; i++)
{
char c; cin >> c; c-='A';
pll best={inf, 0};
for (ll move:t[c])
{
state ne=cr;
if (!ne.Move(move)) continue;
best=min(best, mp(ne.evaluate(), move));
}
if (best.fi==inf) assert(0);
cr.act(best.se);
}
}
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 3588kb
First Run Input
prepare 6 TO LO ZI LI LT LT
First Run Output
OLILLL
Second Run Input
play 6 O L I L L L
Second Run Output
**... **... ..... ..... ..... ##*** ##*.. ..... ..... ..... ****. ###.. ..... ..... ..... ####* ###.* ...** ..... ..... .***. ###*# ...## ..... ..... .###. *.... ***## ..... .....
result:
ok good job!
Test #2:
score: 100
Accepted
time: 0ms
memory: 3636kb
First Run Input
prepare 1 ZI
First Run Output
I
Second Run Input
play 1 I
Second Run Output
****. ..... ..... ..... .....
result:
ok good job!
Test #3:
score: 100
Accepted
time: 1ms
memory: 3912kb
First Run Input
prepare 10 LO TZ ZO OI OL ZL ZO TL OZ LO
First Run Output
OZZIOLOLOO
Second Run Input
play 10 O Z Z I O L O L O O
Second Run Output
**... **... ..... ..... ..... ##.** ##**. ..... ..... ..... ##.## ####* ...** ...*. ..... ##*## ..*.. ..*## ..*#. ..... ..... **#.. **### ..##. ..... ..... ###** ....* ..##* ..... ..... ..... **..# **### ..... ..*.. ..*.. ##**# ..... ..... **#.. **#.. ..... ..... ..... ###** ###** ..... ......
result:
ok good job!
Test #4:
score: 0
Stage 2: Program answer Runtime Error
First Run Input
prepare 29 ZT OT ZL LT ZI LO IZ LT OI ZT ZT OL ZI LT LZ TZ IL ZI OT LZ LT LZ OT OI IO OZ IZ ZL ZL
First Run Output
ZOLTZOZLOZTOZTZTIIOLLLTIIZILL
Second Run Input
play 29 Z O L T Z O Z
Second Run Output
.**.. **... ..... ..... ..... .##** ##.** ..... ..... ..... .#### ##*## ***.. ..... ..... .#### ...*. ###** ...*. ..... *#### **.#. .*... ...#. ..... ..... ##.#. .#... **.#. **...