1 条题解
-
1
注意到此题可以使用广搜,每次扩展节点数都会*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
- 上传者