【Luogu】P1013进制位(搜索)
生活随笔
收集整理的這篇文章主要介紹了
【Luogu】P1013进制位(搜索)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接在這里
? ?這題和蟲食算比較類似。做完這道題可以去做蟲食算。都是搜索一類的題。
? ?這樣 我們分析題目可以發現進制只可能是字母的個數,也就是n-1。為什么?
? ?因為題目要求完整的加法表才算數。如果進制低于n-1,字母就多了;如果進制高,字母就不夠,湊不出一個完整的加法表。所以這題第二問比第一問簡單很多。
? ?再說第一問。可以使用搜索,dfs參數是已經搜的字符個數,如果等于n-1判斷是否合法,合法就可以輸出答案退出程序,不合法就繼續搜。在dfs的時候可以枚舉有哪些字符是沒用過的,再枚舉哪些數字是沒用過的,一一對應。數據范圍很小,可以輕松搞定。
#include<cstdio> #include<cstring> #include<iostream> #include<cstdlib> #include<map> using namespace std; int Map[2000],jd[2000]; int n; char s[200]; char mp[100][100][20]; char que[100]; bool vis[100];bool Check(){for(int i=1;i<=n;++i){for(int j=1;j<=n;++j){char a=jd[que[i]],b=jd[que[j]];int c=0;for(int k=0;k<strlen(mp[i][j]);++k){c=c*n+jd[mp[i][j][k]];}if(a+b!=c)return 0;}}return 1; }void dfs(int deep){if(deep==n){if(!Check()){return;}for(int i=1;i<=n;++i) printf("%c=%d ",que[i],jd[que[i]]);printf("\n");printf("%d",n);exit(0);}for(int i=0;i<n;++i){if(!vis[i]){for(int j=1;j<=n;j++){if(jd[que[j]]==-1){vis[i]=1;jd[que[j]]=i;dfs(deep+1);vis[i]=0;jd[que[j]]=-1;}}}} } int main(){cin>>n;n--;scanf("%s",s);for(int i=1;i<=n;++i){scanf("%s",s);Map[s[0]]=i;que[i]=s[0];jd[s[0]]=-1;}for(int i=1;i<=n;++i){scanf("%s",s);char ch=s[0];for(int j=1;j<=n;++j){scanf("%s",s);for(int k=0;k<strlen(s);++k)mp[Map[ch]][j][k]=s[k];}}dfs(0);printf("ERROR!");return 0; }
?
轉載于:https://www.cnblogs.com/cellular-automaton/p/7467401.html
總結
以上是生活随笔為你收集整理的【Luogu】P1013进制位(搜索)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求一个为梦想努力的个性签名。
- 下一篇: 为什么个性签名看不到