P1092 虫食算

mac2024-10-08  52

题目大意 一道很简单的dfs题,只是剪枝方面的要求很高,还有输出完答案要用exit(0)强行跳出,不然会tle

#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<vector> using namespace std; int a[5][30]; int vis[30]; int ans[30]; int n; vector<int>v; void dfs(int loc){ if(ans[a[0][0]]+ans[a[1][0]]>=n){ return ; } if(loc==n){ int wei=0; for(int i=n-1;i>=0;i--){ int x=ans[a[0][i]],y=ans[a[1][i]],z=ans[a[2][i]]; if((x+y+wei)%n!=z){ return; } if(x+y+wei<n){ wei=0; }else{ wei=1; } } for(int i=0;i<n;i++){ cout<<ans[i]<<" "; } cout<<endl; exit(0); return ; } for(int i=n-1;i>=0;i--){ int x=ans[a[0][i]],y=ans[a[1][i]],z=ans[a[2][i]]; if(x!=-1&&y!=-1&&z!=-1){ if((x+y)%n!=z&&(x+y+1)%n!=z){ return ; } } } for(int i=n-1;i>=0;i--){ if(!vis[i]){ ans[v[loc]]=i; vis[i]=1; dfs(loc+1); ans[v[loc]]=-1; vis[i]=0; } } } int main(){ cin>>n; memset(vis,0,sizeof(vis)); memset(ans,-1,sizeof(ans)); char c; for(int i=0;i<3;i++){ for(int j=0;j<n;j++){ cin>>c; a[i][j]=c-'A'; } } for(int i=n-1;i>=0;i--){ if(vis[a[0][i]]==0){ v.push_back(a[0][i]); vis[a[0][i]]=1; } if(vis[a[1][i]]==0){ v.push_back(a[1][i]); vis[a[1][i]]=1; } if(vis[a[2][i]]==0){ v.push_back(a[2][i]); vis[a[2][i]]=1; } } memset(vis,0,sizeof(vis)); dfs(0); }
最新回复(0)