洛谷P1074:靶形数独(搜索、剪枝)
生活随笔
收集整理的這篇文章主要介紹了
洛谷P1074:靶形数独(搜索、剪枝)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
解析
搜索題都是玄學(xué)
本題暴搜人人都會(huì)寫,關(guān)鍵是如何剪枝
我一直在最優(yōu)性剪枝上糾結(jié)qwq
但仔細(xì)想想,不同方案的權(quán)值差別沒有那么大
再加上剪枝時(shí)不可避免的要放棄一些準(zhǔn)確度
所以最優(yōu)性剪枝在本題可能確實(shí)沒有太大的作用
考慮我們平時(shí)如何玩數(shù)獨(dú)
肯定是先從東西少的地方開始搜啦!
然后放到代碼上試試…
誒?怎么切了?
我們理性的分析一下
可能有一些各自由于自己行已經(jīng)填的東西所以幾乎已經(jīng)確定了
然而如果先搜其他行可能會(huì)在一個(gè)與本來可以確定的地方矛盾的搜索樹上走的太深
所以我們先確定能確定的再搞剩下的會(huì)大大加速
代碼
#include<bits/stdc++.h> using namespace std; #define ll long long #define debug(a,b) fprintf(stderr,a,b) const int N=1e5+100; const int M=2e5+100; const int mod=998244353; const double eps=1e-8; inline ll read(){ll x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f; } int a[11][11] = {{0,0,0,0,0,0,0,0,0,0,0},{0,6,6,6,6,6,6,6,6,6,0},{0,6,7,7,7,7,7,7,7,6,0},{0,6,7,8,8,8,8,8,7,6,0},{0,6,7,8,9,9,9,8,7,6,0},{0,6,7,8,9,10,9,8,7,6,0},{0,6,7,8,9,9,9,8,7,6,0},{0,6,7,8,8,8,8,8,7,6,0},{0,6,7,7,7,7,7,7,7,6,0},{0,6,6,6,6,6,6,6,6,6,0},{0,0,0,0,0,0,0,0,0,0,0} }; bool hang[10][10],lie[10][10],d[10][10],num[10]; int mp[10][10],tot; #define bel(a,b) ((a-1)/3*3+(b-1)/3+1) int now,ans; struct node{int x,num; }p[10]; bool cmp(node a,node b){return a.num>b.num;} int id[10][10],cnt[10]; void dfs(int k,int x,int o){if(k>9){ans=max(ans,now);return;}if(o>cnt[x]){dfs(k+1,p[k+1].x,1);return;}int y=id[x][o];for(int i=1;i<=9;i++){if(hang[x][i]||lie[y][i]||d[bel(x,y)][i]) continue;hang[x][i]=lie[y][i]=d[bel(x,y)][i]=1;now+=i*a[x][y];dfs(k,x,o+1);hang[x][i]=lie[y][i]=d[bel(x,y)][i]=0;now-=i*a[x][y];}return; } int main(){ #ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout); #endif//start=clock();for(int i=1;i<=9;i++){p[i].x=i;for(int j=1;j<=9;j++){int o=read();mp[i][j]=o;if(o){hang[i][o]=lie[j][o]=d[bel(i,j)][o]=1;now+=o*a[i][j];p[i].num++; }else id[i][++cnt[i]]=j;}}sort(p+1,p+1+9,cmp);dfs(1,p[1].x,1);printf("%d\n",ans?ans:-1);return 0; } //2025總結(jié)
以上是生活随笔為你收集整理的洛谷P1074:靶形数独(搜索、剪枝)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux一些好用的命令和快捷键
- 下一篇: 动态区间第k小:树状数组套权值线段树