【P1274】魔术数字游戏(搜索+剪枝+模拟)
做完了这个题的我一口老血喷在屏幕上。。。
这个题难度不高(~~胡扯~~),就是爆搜就可以了,然而。。判断条件灰常多,剪枝也就非常多。。然而,这些判断条件又不得不必须满足,所以也就十分容易错。。。
说一下我都是怎么错的吧。。。
##1:眼瘸少看到一个条件。。。
##2:犯傻以为不加这个地方的数字是否用过的条件也行,结果卡掉。。。
##3:输出完一个结果之后不打return。。。
##4:只是判断了数字1是不是用过忘了要接着return防止覆盖。。。
##5:用已经填上的数字个数而不是位置作为判断条件。。。
好了,错点也不能太多了(要不我也改不对。。。),作为新年的第一道题,这个题也还是挺正(du)常(liu)的。
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<queue> #define re register #define maxn 1000007 #define ll long long using namespace std; int a[101],b[101],vis[101],d,x,n,m,t,s,sum,ans[101]; inline void dfs(int num,int t) { if(a[t]) { dfs(num+1,t+1); return; } if(t>4) { if(a[1]+a[2]+a[3]+a[4]!=34&&a[1]&&a[2]&&a[3]&&a[4]) return; if(t>6) { if(a[1]+a[2]+a[5]+a[6]!=34&&a[1]&&a[2]&&a[5]&&a[6]) return; if(t>8) { if(a[5]+a[6]+a[7]+a[8]!=34&&a[5]&&a[6]&&a[7]&&a[8]) return; if(a[3]+a[4]+a[7]+a[8]!=34&&a[3]&&a[4]&&a[7]&&a[8]) return; if(t>11) { if(a[6]+a[7]+a[10]+a[11]!=34&&a[6]&&a[7]&&a[10]&&a[11]) return; if(num>12) { if(a[9]+a[10]+a[11]+a[12]!=34&&a[9]&&a[10]&&a[11]&&a[12]) return; if(t>13) { if(a[13]+a[10]+a[7]+a[4]!=34&&a[13]&&a[10]&&a[7]&&a[4]) return; if(a[1]+a[5]+a[9]+a[13]!=34&&a[1]&&a[5]&&a[9]&&a[13]) return; if(t>14) { if(a[9]+a[10]+a[13]+a[14]!=34&&a[9]&&a[10]&&a[13]&&a[14]) return; if(a[2]+a[6]+a[10]+a[14]!=34&&a[2]&&a[6]&&a[10]&&a[14]) return; if(t>15) { if(a[3]+a[7]+a[11]+a[15]!=34&&a[3]&&a[7]&&a[11]&&a[15]) return; if(t==17) { if(a[13]+a[14]+a[15]+a[16]!=34&&a[13]&&a[14]&&a[15]&&a[16]) return; if(a[11]+a[12]+a[15]+a[16]!=34&&a[11]&&a[12]&&a[15]&&a[16]) return; if(a[1]+a[6]+a[11]+a[16]!=34&&a[1]&&a[6]&&a[11]&&a[16]) return; if(a[1]+a[4]+a[13]+a[16]!=34&&a[1]&&a[4]&&a[13]&&a[16]) return; if(a[4]+a[8]+a[12]+a[16]!=34&&a[4]&&a[8]&&a[12]&&a[16]) return; for(re int i=1;i<=16;i++) { cout<<a[i]<<" "; if(i%4==0) cout<<endl; } cout<<endl; return; } } } } } } } } } for(re int i=2;i<=16;i++) { if(!b[i]) { b[i]=1; a[t]=i; dfs(num+1,t+1); b[i]=0; a[t]=0; } } } int main() { cin>>s>>t; a[(s-1)*4+t]=1; dfs(0,1); }
对于作者转载文章,欢迎继续转载。
对于作者原创文章,请注明出处之后转载。