简单题求条(有注释,玄三关)
查看原帖
简单题求条(有注释,玄三关)
1272608
ToMaT楼主2024/12/7 10:25

救救孩子吧

#include<bits/stdc++.h>
using namespace std;
#define ToMaT for(int i=1;i<=n;++i)
#define totoe for(int j=1;j<=n;++j) 
int main(){
	int T;//有T组数据 
	cin>>T;
	while(T--){
		int n;//元素个数
		cin>>n; 
		string s,s1,s2,s3;//先输入4个字符串
		cin>>s>>s1>>s2>>s3;
		bool a[100001],b[100001],c[100001],d[100001];//a,b:记录每个数字    c,d:标记是否能交换
		ToMaT{
			a[i]=bool(s[i-1]-'0');
		}//将s复制到a 
		ToMaT{
			b[i]=bool(s1[i-1]-'0');
		}//将s1复制到b 
		ToMaT{
			c[i]=bool(s2[i-1]-'0');
		}//将s2复制到c
		ToMaT{
			d[i]=bool(s3[i-1]-'0');
		}//将s3复制到d
		int cnt=0;//记录答案 
		ToMaT{
			if(a[i]==b[i]){
				c[i]=0;
				d[i]=0;
				cnt+=2;
			}//如果a[i]已经等于b[i],那么就不能修改了,标记为0,添加一对数字,答案加2 
		} 
		ToMaT{
			if(a[i]=b[i]&&(a[i]==1||b[i]==1)){
			    	cnt+=2;
			    	c[i]=0;
			    	d[i]=0;
			}//新交换出的 
			if(c[i]==0&&d[i]==0){//都不能交换 
			    //a[i],b[i]没有价值 
			}
			else if(c[i]==0&&d[i]==1){//只能交换d(b) 
				if(i==1){//避免RE 
					if(d[2]==1&&b[2]==a[1]){//如果b[2]可交换且刚好与a[1]相等那么就交换b[2],b[1] 
					    swap(b[2],b[1]);
						cnt+=2; 
					} 
				} 
				else if(i==n){//避免RE 
					if(d[n-1]==1&&b[n-1]==a[n]){//如果b[n-1]可交换且刚好与a[n]相等那么就交换b[n],b[n-1] 
						swap(b[n],b[n-1]);
						cnt+=2;
					}
				} 
				else{
					if(d[i-1]==1&&b[i-1]==a[i]){//如果b[i]的前一个与a[i]相等且可交换那么就优先交换前一个,即b[i-1]与b[i] 
						swap(b[i-1],b[i]);
						cnt+=2; 
					}
					else if(d[i+1]==1&&b[i+1]==a[i]){//如果b[i]的后一个与a[i]相等且可交换那么就交换后一个,即b[i+1]与b[i] 
						swap(b[i+1],b[i]);
						cnt+=2; 
					}
					else{
						//如果怎么交换都不行那么就不管它了 
					}
				} 
			} 
			else if(c[i]==1&&d[i]==0){//只能交换c(a) 
				if(i==1){//避免RE 
					if(c[2]==1&&a[2]==b[1]){//如果a[2]可交换且刚好与b[1]相等那么就交换a[2],a[1] 
					    swap(a[2],a[1]);
						cnt+=2; 
					} 
				} 
				else if(i==n){//避免RE 
					if(c[n-1]==1&&a[n-1]==b[n]){//如果a[n-1]可交换且刚好与b[n]相等那么就交换a[n],a[n-1] 
						swap(a[n],a[n-1]);
						cnt+=2;
					}
				} 
				else{
					if(c[i-1]==1&&a[i-1]==b[i]){//如果a[i]的前一个与b[i]相等且可交换那么就优先交换前一个,即a[i-1]与a[i] 
						swap(a[i-1],a[i]);
						cnt+=2; 
					}
					else if(c[i+1]==1&&a[i+1]==b[i]){//如果a[i]的后一个与b[i]相等且可交换那么就交换后一个,即a[i+1]与a[i] 
						swap(a[i+1],a[i]);
						cnt+=2; 
					}
					else{
						//如果怎么交换都不行那么就不管它了 
					}
				} 
			} 
			else{//都可以交换 
				if(i==1){//避免RE 
					if(c[2]==1&&a[2]==b[1]){//如果a[2]可交换且刚好与b[1]相等那么就交换a[2],a[1] 
					    swap(a[2],a[1]);
						cnt+=2; 
						continue;
					} 
				} 
				else if(i==n){//避免RE 
					if(c[n-1]==1&&a[n-1]==b[n]){//如果a[n-1]可交换且刚好与b[n]相等那么就交换a[n],a[n-1] 
						swap(a[n],a[n-1]);
						cnt+=2;
						continue;
					}
				} 
				else{
					if(c[i-1]==1&&a[i-1]==b[i]){//如果a[i]的前一个与b[i]相等且可交换那么就优先交换前一个,即a[i-1]与a[i] 
						swap(a[i-1],a[i]);
						cnt+=2; 
						continue;
					}
					else if(c[i+1]==1&&a[i+1]==b[i]){//如果a[i]的后一个与b[i]相等且可交换那么就交换后一个,即a[i+1]与a[i] 
						swap(a[i+1],a[i]);
						cnt+=2; 
						continue;
					}
					else{
						//如果怎么交换都不行那么就不管它了 
					}
				} 
				if(i==1){//避免RE 
					if(c[2]==1&&a[2]==b[1]){//如果a[2]可交换且刚好与b[1]相等那么就交换a[2],a[1] 
					    swap(a[2],a[1]);
						cnt+=2; 
						continue;
					} 
				} 
				else if(i==n){//避免RE 
					if(c[n-1]==1&&a[n-1]==b[n]){//如果a[n-1]可交换且刚好与b[n]相等那么就交换a[n],a[n-1] 
						swap(a[n],a[n-1]);
						cnt+=2;
						continue;
					}
				} 
				else{
					if(c[i-1]==1&&a[i-1]==b[i]){//如果a[i]的前一个与b[i]相等且可交换那么就优先交换前一个,即a[i-1]与a[i] 
						swap(a[i-1],a[i]);
						cnt+=2; 
						continue;
					}
					else if(c[i+1]==1&&a[i+1]==b[i]){//如果a[i]的后一个与b[i]相等且可交换那么就交换后一个,即a[i+1]与a[i] 
						swap(a[i+1],a[i]);
						cnt+=2; 
						continue;
					}
					else{
						//如果怎么交换都不行那么就不管它了 
					}
				} 
			}
		} 
		cout<<cnt<<endl;
	} 
	return 0;
}
2024/12/7 10:25
加载中...