QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#658878#7014. Rikka with Grid GraphsqvzeyangAC ✓2515ms4396kbC++205.1kb2024-10-19 17:50:132024-10-19 17:50:13

Judging History

你现在查看的是最新测评结果

  • [2024-10-19 17:50:13]
  • 评测
  • 测评结果:AC
  • 用时:2515ms
  • 内存:4396kb
  • [2024-10-19 17:50:13]
  • 提交

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,我给组数据试试?

詳細信息

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