QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#658878 | #7014. Rikka with Grid Graphs | qvzeyang | AC ✓ | 2515ms | 4396kb | C++20 | 5.1kb | 2024-10-19 17:50:13 | 2024-10-19 17:50:13 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
#define mp make_pair
#define pr pair<int,int>
#define _(x,y) x=(x+y)%mod
#define ll long long
#define int long long
int read(){int d=1,k=0;char c=getchar();
while(!(c>='0' and c<='9' or c=='-'))c=getchar();if(c=='-')d=-1,c=getchar();
while(c>='0' and c<='9')k=(k<<3)+(k<<1)+(c^48),c=getchar();return d*k;}
struct node{
bool x[8][8];
bool operator<(const struct node xx)const{
for(int i=1;i<=6;i++){
for(int j=1;j<=6;j++){
if(x[i][j]!=xx.x[i][j])return x[i][j]<xx.x[i][j];
}
}return 0;
}
};
map<node,int>dp,nex;
int n,m;
void predo(){
node u;
memset(u.x,0,sizeof(u.x));
dp[u]=1;
}
node go;
int vis[40];
void dfs(int x){
// cout<<" !!! "<<x<<endl;
if(vis[x])return;
vis[x]=1;
for(int i=1;i<=m+1;i++){
if(go.x[x][i])dfs(i);
}
}
bool work(){
for(int i=1;i<=m+1;i++){
for(int j=1;j<=m+1;j++)vis[j]=0;
dfs(i);
for(int j=1;j<=m+1;j++)go.x[i][j]=vis[j];
}
for(int k=1;k<=m+1;k++)go.x[k][k]=0;
for(int i=1;i<=m+1;i++){
for(int j=i+1;j<=m+1;j++)if(go.x[i][j] and go.x[j][i])return 0;
}return 1;
}
string s[100];
signed main(){
int T=read();while(T--){
dp.clear(),nex.clear();
n=read(),m=read();
for(int i=1;i<=n*2-1;i++){
getline(cin,s[i]);
s[i]=" "+s[i];
while(s[i].length()<m*2)s[i]+=" ";
// for(int j=1;j<=m*2-1;j++)cout<<s[i][j];cout<<endl;
}
predo();
// cout<<endl<<endl;
// for(int i=1;i<=n*2-1;i++){
// }
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
// cout<<" "<<i<<" "<<j<<endl;
for(auto it=dp.begin();it!=dp.end();it++){
node now=(*it).first;
int v=(*it).second;
// for(int I=1;I<=n;I++){
// for(int J=1;J<=m;J++)cout<<(int)now.x[I][J];
// cout<<endl;
// }
// cout<<v<<endl;
bool flag;
if(s[i*2-1][j*2-2]!='-' and s[i*2-2][j*2-1]!='|'){
go=now;
for(int k=1;k<=m;k++)go.x[k][j]=go.x[j][k]=0;
nex[go]+=v;
}
//左
// cout<<" !? "<<i<<" "<<j<<" "<<i*2-1<<" "<<j*2-2<<endl;
if(s[i*2-1][j*2-2]=='-' and s[i*2-2][j*2-1]!='|'){
go=now;
go.x[j-1][m+1]=1;
flag=work();
for(int k=1;k<=m;k++)go.x[j][k]=go.x[m+1][k];
for(int k=1;k<=m;k++)go.x[k][j]=go.x[k][m+1];
for(int k=1;k<=m;k++)go.x[k][m+1]=0;
for(int k=1;k<=m+1;k++)go.x[m+1][k]=0;
if(flag)nex[go]+=v;
go=now;
go.x[m+1][j-1]=1;
flag=work();
for(int k=1;k<=m;k++)go.x[j][k]=go.x[m+1][k];
for(int k=1;k<=m;k++)go.x[k][j]=go.x[k][m+1];
for(int k=1;k<=m;k++)go.x[k][m+1]=0;
for(int k=1;k<=m+1;k++)go.x[m+1][k]=0;
if(flag)nex[go]+=v;
}
//上
if(s[i*2-2][j*2-1]=='|' and s[i*2-1][j*2-2]!='-'){
go=now;
go.x[j][m+1]=1;
flag=work();
for(int k=1;k<=m;k++)go.x[j][k]=go.x[m+1][k];
for(int k=1;k<=m;k++)go.x[k][j]=go.x[k][m+1];
for(int k=1;k<=m;k++)go.x[k][m+1]=0;
for(int k=1;k<=m+1;k++)go.x[m+1][k]=0;
if(flag)nex[go]+=v;
go=now;
go.x[m+1][j]=1;
flag=work();
for(int k=1;k<=m;k++)go.x[j][k]=go.x[m+1][k];
for(int k=1;k<=m;k++)go.x[k][j]=go.x[k][m+1];
for(int k=1;k<=m;k++)go.x[k][m+1]=0;
for(int k=1;k<=m+1;k++)go.x[m+1][k]=0;
if(flag)nex[go]+=v;
}
//左上
if(s[i*2-2][j*2-1]=='|' and s[i*2-1][j*2-2]=='-'){
go=now;
go.x[j][m+1]=1;
go.x[j-1][m+1]=1;
flag=work();
for(int k=1;k<=m;k++)go.x[j][k]=go.x[m+1][k];
for(int k=1;k<=m;k++)go.x[k][j]=go.x[k][m+1];
for(int k=1;k<=m;k++)go.x[k][m+1]=0;
for(int k=1;k<=m+1;k++)go.x[m+1][k]=0;
if(flag)nex[go]+=v;
go=now;
go.x[m+1][j]=1;
go.x[j-1][m+1]=1;
flag=work();
for(int k=1;k<=m;k++)go.x[j][k]=go.x[m+1][k];
for(int k=1;k<=m;k++)go.x[k][j]=go.x[k][m+1];
for(int k=1;k<=m;k++)go.x[k][m+1]=0;
for(int k=1;k<=m+1;k++)go.x[m+1][k]=0;
if(flag)nex[go]+=v;
go=now;
go.x[j][m+1]=1;
go.x[m+1][j-1]=1;
flag=work();
for(int k=1;k<=m;k++)go.x[j][k]=go.x[m+1][k];
for(int k=1;k<=m;k++)go.x[k][j]=go.x[k][m+1];
for(int k=1;k<=m;k++)go.x[k][m+1]=0;
for(int k=1;k<=m+1;k++)go.x[m+1][k]=0;
if(flag)nex[go]+=v;
go=now;
go.x[m+1][j]=1;
go.x[m+1][j-1]=1;
flag=work();
for(int k=1;k<=m;k++)go.x[j][k]=go.x[m+1][k];
for(int k=1;k<=m;k++)go.x[k][j]=go.x[k][m+1];
for(int k=1;k<=m;k++)go.x[k][m+1]=0;
for(int k=1;k<=m+1;k++)go.x[m+1][k]=0;
if(flag)nex[go]+=v;
}
}
dp=nex;
nex.clear();
// cout<<dp.size()<<endl;
}
}
int ans=0;
for(auto it=dp.begin();it!=dp.end();it++)ans+=(*it).second;
cout<<ans<<"\n";
for(int i=1;i<=2*n;i++)s[i].clear();
}
return 0;
}
这程序好像有点Bug,我给组数据试试?
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3584kb
input:
4 2 2 +-+ + + 2 2 +-+ | + + 2 2 +-+ | +-+ 2 2 +-+ | | +-+
output:
2 4 8 14
result:
ok 4 lines
Test #2:
score: 0
Accepted
time: 2515ms
memory: 4396kb
input:
60 1 1 + 6 6 +-+-+-+-+-+ | | | | | | +-+-+-+-+-+ | | | | | | +-+-+-+-+-+ | | | | | | +-+-+-+-+-+ | | | | | | +-+-+-+-+-+ | | | | | | +-+-+-+-+-+ 6 4 + + + + + + + + + + + + + + + + + + + + + + + + 4 5 +-+-+-+ + | | +-+-+-+ + | | +-+ +-+ + | | + + +-+ + 5 6 + + +-+ + + | | | | | +-...
output:
1 39931856138212664 1 32768 2097152 396928 1912140726272 17072685056 33681342464 1070508371744 4877910016 470169766912 181121759168 814322432 891691528874048 358663151840 1905966526844408 851738327552 191458384162304 288115586432 1368156669845336 356038587648896 3776487925133468 691176008890304 1090...
result:
ok 60 lines