1 条题解

  • 1
    @ 2025-4-16 21:25:45

    注意到此题可以使用广搜,每次扩展节点数都会*16,由计算器可以知道 16的6次方为16777216,16的7次方为268435456会爆所以可以深搜+玄学剪枝

    思路:深搜,当层数大于6,直接跳出,输出无解

    #include<bits/stdc++.h>
    using namespace std;
    int a[16],b[4][4];
    int ans=1000;
    
    void dfs(int k,int tmp[]){
    	if(k>=6||k>ans) return ; 
    	int hh=0;
    	int cnt[4][4];
    	for(int i=0;i<16;i++){
    		cnt[i/4][i%4]=tmp[i];
    	}
    	for(int i=0;i<4;i++){
    		for(int j=0;j<4;j++){
    			if(cnt[i][j]!=b[i][j]){
    				hh=1;
    				break;
    			}
    		}
    	}
    	if(!hh){
    		ans=k;
    		return;
    	}
    	int cnt1[4][4];
    	for(int i=0;i<4;i++){
    		for(int j=0;j<4;j++){
    			cnt1[i][j]=cnt[i][j];
    		}
    	}
    	for(int i=0;i<4;i++){
    		for(int j=0;j<4;j++){
    			cnt1[i][j]=1-cnt1[i][j];
    			if(i-1>=0) cnt1[i-1][j]=1-cnt1[i-1][j];
    			if(j-1>=0) cnt1[i][j-1]=1-cnt1[i][j-1];
    			if(i+1<4) cnt1[i+1][j]=1-cnt1[i+1][j];
    			if(j+1<4) cnt1[i][j+1]=1-cnt1[i][j+1];
    			int tmp1[16];
    			for(int i=0;i<16;i++){
    				tmp1[i]=cnt1[i/4][i%4];
    			}
    			dfs(k+1,tmp1);
    			cnt1[i][j]=1-cnt1[i][j];
    			if(i-1>=0) cnt1[i-1][j]=1-cnt1[i-1][j];
    			if(j-1>=0) cnt1[i][j-1]=1-cnt1[i][j-1];
    			if(i+1<4) cnt1[i+1][j]=1-cnt1[i+1][j];
    			if(j+1<4) cnt1[i][j+1]=1-cnt1[i][j+1];
    		}
    	}
    	return ;
    }
    
    int main(){	
    	for(int i=0;i<4;i++){
    		int p;
    		cin>>p;
    		for(int j=0;j<4;j++){
    			a[i*4+3-j]=p%10;
    			p/=10;
    		}
    	}
    	for(int i=0;i<4;i++){
    		int p;
    		cin>>p;
    		for(int j=0;j<4;j++){
    			b[i][3-j]=p%10;
    			p/=10;
    		}
    	}
    	dfs(0,a);
    	if(ans==1000) cout<<"No solution";
    	else cout<<ans;	
    	return 0;
    }
    
    • 1

    信息

    ID
    1521
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    递交数
    18
    已通过
    5
    上传者