求调双向搜索样例输出0
查看原帖
求调双向搜索样例输出0
578029
ivyjiao楼主2024/9/26 19:58

还有能不能帮我改成哈希的版本?

#include<bits/stdc++.h>
#define int long long
#define PII pair<int,int>
#define fi first
#define se second
using namespace std;
const int mod=1e9+7;
int n,m,a[9],b[9],ans;
vector<PII>p;
map<vector<int>,int>mp;
void dfs1(int u){
    if(u>m/2){
    	vector<int>cnt;
    	for(int i=1;i<=n;i++) cnt.push_back(b[i]);
        mp[cnt]++;
        return;
    }
    int x=p[u].fi,y=p[u].se;
    if(b[x]+3<=a[x]) b[x]+=3,dfs1(u+1),b[x]-=3;
    if(b[y]+3<=a[y]) b[y]+=3,dfs1(u+1),b[y]-=3;
    if(b[x]+1<=a[x]&&b[y]+1<=a[y]) b[x]++,b[y]++,dfs1(u+1),b[x]--,b[y]--;
}
void dfs2(int u){
    if(u>m-1){
    	vector<int>cnt;
    	for(int i=1;i<=n;i++) cnt.push_back(a[i]-b[i]);
        if(mp[cnt]) ans+=mp[cnt];
        return;
    }
    int x=p[u].fi,y=p[u].se;
    if(b[x]+3<=a[x]) b[x]+=3,dfs1(u+1),b[x]-=3;
    if(b[y]+3<=a[y]) b[y]+=3,dfs1(u+1),b[y]-=3;
    if(b[x]+1<=a[x]&&b[y]+1<=a[y]) b[x]++,b[y]++,dfs1(u+1),b[x]--,b[y]--;
}
signed main(){
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++) p.push_back({i,j});
    }
    m=n*(n-1)/2;
    dfs1(0);
    dfs2(m/2+1);
    cout<<ans;
}
2024/9/26 19:58
加载中...