abc326-d 题解

比较麻烦的暴力搜索

abc326-d 题解
题目链接
一开始读错题了,以为abc可以出现多次,浪费了很多时间,一定要戒骄戒躁读好题!
这种搜索题要思路打开,想一想以什么搜索
按列去搜索,感觉自己写的有点麻烦了
我的代码:

#include<bits/stdc++.h>
using namespace std;
int n;
string rr,cc;//row,column
int r[10],c[10];
int cntr[10];//row [i] is empty是否前面没有字母:需要向r对齐
bool ise[10][10];//ise[i][j]: 字母j是否存在于rowi中 
int mp[10][10];
bool flag=false;
int ans=0;
void out(){
	cout<<"Yes"<<endl;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(mp[i][j]==-1) cout<<".";
			else cout<<(char)(mp[i][j]+'A');
		}
		cout<<endl;
	}
	/*for(int i=1;i<=n;i++){
		for(int j=0;j<=2;j++){
			cout<<ise[i][j];
		}
		cout<<endl;
	}
	cout<<"-------------------";*/
}
void dfs(int iofc){//i of column: dfs每一个column c35 * 2的样本空间 
	if(flag) return;
	if(iofc==n+1){
		flag=1;
		out();
	}
	//cout<<endl;
	//cout<<iofc<<endl;
	//out();
	for(int i=1;i<=n-2;i++){//每个column的第一个数
		int x=c[iofc],y=(c[iofc]+1)%3,z=(c[iofc]+2)%3;
		if(ise[i][x]) continue;//
		if(cntr[i]==0&&x!=r[i]) continue;
		ise[i][c[iofc]]=1; mp[i][iofc]=c[iofc]; cntr[i]++;
		//c[i]+1为此列的第二个数 
		for(int j=i+1;j<=n-1;j++){
			if(ise[j][y]) continue;//改1 
			if(cntr[j]==0&&y!=r[j]) continue;
			ise[j][y]=1; mp[j][iofc]=y; cntr[j]++;
			for(int k=j+1;k<=n;k++){
				if(ise[k][z]) continue;
				if(cntr[k]==0&&z!=r[k]) continue;
				ise[k][z]=1; mp[k][iofc]=z; cntr[k]++;
				dfs(iofc+1);
				ise[k][z]=0; mp[k][iofc]=-1; cntr[k]--;
			}
			ise[j][y]=0; mp[j][iofc]=-1; cntr[j]--;
		}
		//c[i]+1为此列的第三个数 
		z=(c[iofc]+1)%3;y=(c[iofc]+2)%3;
		for(int j=i+1;j<=n-1;j++){
			if(ise[j][y]) continue;
			if(cntr[j]==0&&y!=r[j]) continue;
			ise[j][y]=1; mp[j][iofc]=y; cntr[j]++;//注意取余 
			for(int k=j+1;k<=n;k++){
				if(ise[k][z]) continue;
				if(cntr[k]==0&&z!=r[k]) continue;
				ise[k][z]=1; mp[k][iofc]=z; cntr[k]++;
				dfs(iofc+1);
				ise[k][z]=0; mp[k][iofc]=-1; cntr[k]--;
			}
			ise[j][y]=0; mp[j][iofc]=-1; cntr[j]--;
		}
		ise[i][x]=0; mp[i][iofc]=-1; cntr[i]--;
	}
	
}

int main(){
	ios::sync_with_stdio(0);
	cout.tie(0);
	cin>>n;
	cin>>rr>>cc;
	for(int i=1;i<=n;i++) r[i]=rr[i-1]-'A';
	for(int i=1;i<=n;i++) c[i]=cc[i-1]-'A';
	memset(mp,-1,sizeof(mp));
	memset(cntr,0,sizeof(cntr));
	dfs(1);
	if(!flag) cout<<"No";
	return 0;
}
posted @ 2025-11-16 00:24  YoumaKazusa  阅读(0)  评论(0)    收藏  举报