QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#471385 | #5416. Fabulous Fungus Frenzy | yz_ly | WA | 1ms | 4028kb | C++14 | 4.1kb | 2024-07-10 20:51:31 | 2024-07-10 20:51:31 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int f=1,x=0;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-f;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return f*x;
}
inline void work(int k){
if(k<0){
putchar('-');
k=-k;
}
if(k>9)
work(k/10);
putchar(k%10+'0');
}
/*
倒着做,一个完全相同的矩阵可以变成通用符,因为k很小,感觉dfs一下就差不多了
*/
int n,m,k,h[25],w[25],id[155],num;
char s[25][25],t[25][25],g[25][25][25];
set<pair<int,int> > q[65],p[25][65],c[65];
struct node{
int f,x,y;
};
vector<node> ans;
void solve(int l,int r,int x,int y,set<pair<int,int> > *q){
q[id[t[l][r]]].erase(make_pair(l,r));
q[id[t[x][y]]].erase(make_pair(x,y));
swap(t[l][r],t[x][y]);
q[id[t[l][r]]].insert(make_pair(l,r));
q[id[t[x][y]]].insert(make_pair(x,y));
}
void calc(int l,int r,int x,int y,set<pair<int,int> > *q){
while(r<y){
solve(l,r,l,r+1,q);
ans.emplace_back(node{-1,l,r});
r++;
}
while(r>y){
solve(l,r,l,r-1,q);
ans.emplace_back(node{-2,l,r});
r--;
}
while(l<x){
solve(l,r,l+1,r,q);
ans.emplace_back(node{-3,l,r});
l++;
}
while(l>x){
solve(l,r,l-1,r,q);
ans.emplace_back(node{-4,l,r});
l--;
}
}
bool dfs(set<pair<int,int> > *q){
char gg[25][25];
int flag=0;
set<pair<int,int> > now[65];
for(int i=1;i<=num;i++){
if(q[i].size()>c[i].size()){
flag=1;
int f=0;
for(int j=1;j<=k;j++){
if(p[j][i].size()&&q[i].size()>=p[j][i].size()){
f=1;
for(int x=1;x<=n;x++){
for(int y=1;y<=m;y++){
gg[x][y]=t[x][y];
}
}
for(int d=0;d<=num;d++){
now[d]=q[d];
}
int ff=0;
vector<node> hh=ans;
for(int x=1;x<=h[j];x++){
for(int y=1;y<=w[j];y++){
if(now[id[g[j][x][y]]].size()){
calc((*now[id[g[j][x][y]]].begin()).first,(*now[id[g[j][x][y]]].begin()).second,x,y,now);
}
else if(now[0].size())
calc((*now[0].begin()).first,(*now[0].begin()).second,x,y,now);
else{
ff=1;
break;
}
now[id[t[x][y]]].erase(make_pair(x,y));
t[x][y]=0;
}
if(ff)
break;
}
for(int x=1;x<=h[j];x++){
for(int y=1;y<=w[j];y++){
now[0].insert(make_pair(x,y));
}
}
if(ff){
ans=hh;
for(int x=1;x<=n;x++){
for(int y=1;y<=m;y++){
t[x][y]=gg[x][y];
}
}
continue;
}
ans.emplace_back(node{j,1,1});
if(dfs(now))
return true;
ans=hh;
for(int x=1;x<=n;x++){
for(int y=1;y<=m;y++){
t[x][y]=gg[x][y];
}
}
}
}
if(!f)
return false;
}
}
if(!flag){
for(int i=0;i<=num;i++){
now[i]=q[i];
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(now[id[s[i][j]]].size()){
calc((*now[id[s[i][j]]].begin()).first,(*now[id[s[i][j]]].begin()).second,i,j,now);
now[id[s[i][j]]].erase(make_pair(i,j));
}
else{
calc((*now[0].begin()).first,(*now[0].begin()).second,i,j,now);
now[0].erase(make_pair(i,j));
}
}
}
return true;
}
return false;
}
int main(){
n=read();
m=read();
k=read();
for(int i='0';i<='9';i++){
id[i]=++num;
}
for(int i='a';i<='z';i++){
id[i]=++num;
}
for(int i='A';i<='Z';i++){
id[i]=++num;
}
for(int i=1;i<=n;i++){
scanf("%s",s[i]+1);
for(int j=1;j<=m;j++){
c[id[s[i][j]]].insert(make_pair(i,j));
}
}
for(int i=1;i<=n;i++){
scanf("%s",t[i]+1);
for(int j=1;j<=m;j++){
q[id[t[i][j]]].insert(make_pair(i,j));
}
}
for(int i=1;i<=k;i++){
h[i]=read();
w[i]=read();
for(int j=1;j<=h[i];j++){
scanf("%s",g[i][j]+1);
}
for(int j=1;j<=h[i];j++){
for(int d=1;d<=w[i];d++){
p[i][id[g[i][j][d]]].insert(make_pair(j,d));
}
}
}
if(dfs(q)){
reverse(ans.begin(),ans.end());
work(ans.size());
putchar('\n');
for(auto i:ans){
work(i.f);
putchar(' ');
work(i.x);
putchar(' ');
work(i.y);
putchar('\n');
}
}
else
work(-1);
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 4028kb
input:
3 3 1 OOO GOG BGB OOO GGG BBB 3 1 B G B
output:
13 -2 3 2 -4 3 3 -1 3 2 -2 2 2 -4 2 3 -1 2 2 -2 1 3 -2 1 2 1 1 1 -2 3 2 -2 2 2 -4 2 1 -4 3 1
result:
ok puzzle solved
Test #2:
score: 0
Accepted
time: 0ms
memory: 4016kb
input:
2 2 1 OO OO PP PP 1 2 OP
output:
-1
result:
ok puzzle solved
Test #3:
score: -100
Wrong Answer
time: 1ms
memory: 3864kb
input:
4 8 4 11122222 33344444 55556666 77777777 NIxSHUOx DExDUIxx DANxSHIx YUANSHEN 2 3 NIy DEx 3 8 zzzzzzzz DANNSH9I YUA9SHEN 1 1 x 2 5 SHO8y DUUI8
output:
230 4 1 1 -3 1 5 -1 1 4 -1 1 3 -1 1 2 -1 1 1 -3 1 4 -1 1 3 -1 1 2 -1 1 1 -4 3 3 -4 4 3 -2 4 4 -2 4 5 -2 4 6 -2 4 7 -2 4 8 -4 3 2 -4 4 2 -2 4 3 -2 4 4 -2 4 5 -2 4 6 -2 4 7 -3 1 1 -2 1 2 -2 1 3 -2 1 4 -2 1 5 -2 1 6 -4 2 3 -4 3 3 -4 4 3 -2 4 4 -2 4 5 -2 4 6 -2 4 7 -2 4 8 -4 2 2 -4 3 2 -4 4 2 -2 4 3 -2 ...
result:
wrong answer puzzle remain unsolved