Luogu P1092 蟲食算

来源:http://www.cnblogs.com/Hammer-cwz-77/archive/2017/08/24/7422265.html
-Advertisement-
Play Games

題目描述 所謂蟲食算,就是原先的算式中有一部分被蟲子啃掉了,需要我們根據剩下的數字來判定被啃掉的字母。來看一個簡單的例子: 43#9865#045 +8468#6633 44445509678 其中#號代表被蟲子啃掉的數字。根據算式,我們很容易判斷:第一行的兩個數字分別是5和3,第二行的數字是5。 ...


題目描述

所謂蟲食算,就是原先的算式中有一部分被蟲子啃掉了,需要我們根據剩下的數字來判定被啃掉的字母。來看一個簡單的例子:

43#9865#045

+8468#6633

44445509678

其中#號代表被蟲子啃掉的數字。根據算式,我們很容易判斷:第一行的兩個數字分別是5和3,第二行的數字是5。

現在,我們對問題做兩個限制:

首先,我們只考慮加法的蟲食算。這裡的加法是N進位加法,算式中三個數都有N位,允許有前導的0。

其次,蟲子把所有的數都啃光了,我們只知道哪些數字是相同的,我們將相同的數字用相同的字母表示,不同的數字用不同的字母表示。如果這個算式是N進位的,我們就取英文字母表午的前N個大寫字母來表示這個算式中的0到N-1這N個不同的數字:但是這N個字母並不一定順序地代表0到N-1)。輸入數據保證N個字母分別至少出現一次。

BADC

  • CBDA

DCCC 上面的算式是一個4進位的算式。很顯然,我們只要讓ABCD分別代表0123,便可以讓這個式子成立了。你的任務是,對於給定的N進位加法算式,求出N個不同的字母分別代表的數字,使得該加法算式成立。輸入數據保證有且僅有一組解

輸入輸出格式

輸入格式:

 

包含四行。第一行有一個正整數N(N<=26),後面的3行每行有一個由大寫字母組成的字元串,分別代表兩個加數以及和。這3個字元串左右兩端都沒有空格,從高位到低位,並且恰好有N位。

 

輸出格式:

 

包含一行。在這一行中,應當包含唯一的那組解。解是這樣表示的:輸出N個數字,分別表示A,B,C……所代表的數字,相鄰的兩個數字用一個空格隔開,不能有多餘的空格。

 

輸入輸出樣例

輸入樣例#1:
5
ABCED
BDACE
EBBAA
輸出樣例#1:
1 0 3 4 2

說明

對於30%的數據,保證有N<=10;

對於50%的數據,保證有N<=15;

對於全部的數據,保證有N<=26。

noip2004提高組第4題

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 int n;//讀入幾進位0.1.2.3...n-1
  4 int res[26];//保存A.B..Z代表的數字
  5 int used[26];//保存這個對應數字是否被用,因為題目說每個字母只能代表一個數
  6 string a,b,c;//保存加數1,加數2,和
  7 int flag = 0;//是否已找到符合條件的唯一解//加上這個多對了2個點//
  8 //-----最多只能7個點了,原先是從abcd..填字母,改變
  9 char pos[26];//保存從右往左,從上往下的字母出現順序,判斷的時候也按這個順序判斷
 10 int  usedZiMu[26];//保存該字母是否已經出現
 11 
 12 //剪枝優化函數,來判斷當前的字母的數字取法是否可行
 13 //題目就是一個可行與否的問題
 14 int Check()
 15 {
 16     int i;
 17     //看是否滿足 a+b==c
 18     for (i=n-1;i>=0;i--)
 19     {
 20         char a1=a[i]-'A',b1=b[i]-'A',c1=c[i]-'A';//取三個數第i位置值
 21         if(res[a1]!=-1 && res[b1]!=-1 && res[c1]!=-1)//3個數都知道-----3個點
 22         {
 23             if( (res[a1]+res[b1])%n!=res[c1] &&//無進位
 24                 (res[a1]+res[b1]+1)%n!=res[c1])//有進位
 25                 return 0;
 26         }
 27         //加上後面這些多對了1個點
 28         if(res[a1]!=-1 && res[b1]!=-1 && res[c1]==-1)//如果只知道其中2個
 29         {
 30             int sum1,sum2;//sum1無進位,sum2有進位
 31             sum1 = (res[a1]+res[b1])%n;
 32             sum2 = (res[a1]+res[b1]+1)%n;
 33             if (used[sum1] && used[sum2])//可能填在c1的數都用了肯定不行
 34                 return 0;
 35         }
 36         if (res[a1]!=-1 && res[b1]==-1 && res[c1]!=-1)//和與一個加數知道
 37         {
 38             int js1,js2;//js1無進位,js2有進位
 39             js1 = (res[c1]-res[a1]+n)%n;
 40             js2 = (res[c1]-res[a1]-1+n)%n;
 41             if (used[js1] && used[js2])//可能填寫咋b1位置的數都被用了
 42                 return 0;
 43         }
 44         if (res[a1]==-1 && res[b1]!=-1 && res[c1]!=-1)//和與一個加數知道
 45         {
 46             int js1,js2;//js1無進位,js2有進位
 47             js1 = (res[c1]-res[b1]+n)%n;
 48             js2 = (res[c1]-res[b1]-1+n)%n;
 49             if (used[js1] && used[js2])//可能填寫咋b1位置的數都被用了
 50                 return 0;
 51         }
 52         
 53     }
 54     return 1;
 55 }
 56 /*剪枝策略只這樣寫,數據只過3個點
 57 int Check()
 58 {
 59     int i;
 60     //看是否滿足 a+b==c
 61     for (i=0;i<=n-1;i++)
 62     {
 63         char a1=a[i]-'A',b1=b[i]-'A',c1=c[i]-'A';//取三個數第i位置值
 64         if(res[a1]!=-1 && res[b1]!=-1 && res[c1]!=-1)
 65         {
 66             if( (res[a1]+res[b1])%n!=res[c1] &&//無進位
 67                 (res[a1]+res[b1]+1)%n!=res[c1])//有進位
 68                 return 0;
 69         }
 70 
 71     }
 72     return 1;
 73 }
 74 */
 75 //嚴格判斷當前所有字母的填數滿足等式否
 76 int  OK()
 77 {
 78     int i;
 79     int jinwei=0;
 80     int jiahe;
 81     for (i=n-1; i>=0; i--)
 82     {
 83         char a1=a[i]-'A',b1=b[i]-'A',c1=c[i]-'A';
 84         
 85         jiahe = (res[a1]+res[b1]+jinwei)%n;//計算和
 86         jinwei =( res[a1]+res[b1]+jinwei)/n;//計算進位
 87         if (jiahe!=res[c1]) return 0;
 88     }
 89     if (jinwei>0) return 0;
 90     return 1;
 91 }
 92 void dfs(int k)//深搜,利用系統的堆棧枚舉
 93 {
 94     int i;
 95     if (flag) return ;//已找到解
 96     if (!Check()) return;//現在的方法不合理--從if (!used[i]&&Check())移到這裡多了1個點共7個了
 97     if(k==n)//找到可行解且唯一(題目得知),輸出
 98     {
 99         if (OK())//如果當前所有字母填數滿足等式則輸出
100         {
101             for(i=0; i<=n-2; i++) cout<<res[i]<<' ';
102             cout<<res[n-1]<<endl;
103             flag=1;
104         }
105         return ;
106     }
107     //在第k層,也就是第k個字母所可能取得數為0...n-1中未用值枚舉
108     for (i=n-1; i>=0; i--)
109     {
110         //如果i還沒被占用,且滿足剪枝條件,則進行下層遍歷
111         if (!used[i] )
112         {
113             used[i]=1;//i被占用
114             res[pos[k]]=i;//第k個字母取數字i
115             dfs(k+1);
116             used[i]=0;//i被釋放,可以被其他字母占用
117             res[pos[k]]=-1;//第k個字母釋放
118         }
119     }
120     return ;
121 }
122 
123 int main()
124 {
125     int k=0,i;
126     //讀入數據
127     cin>>n;
128     cin>>a>>b>>c;
129     memset(res,-1,sizeof(res));
130     memset(pos,-1,sizeof(pos));
131     //初始化
132     for (i=n-1; i>=0; i--)//從右向左
133     {
134         char a1=a[i]-'A',b1=b[i]-'A',c1=c[i]-'A';//全部轉成對應數字下標
135         if (!usedZiMu[a1]) ///從上往下
136         {
137             usedZiMu[a1]=1;
138             pos[k++] = a1;
139         }
140         if (!usedZiMu[b1]) 
141         {
142             usedZiMu[b1]=1;
143             pos[k++] = b1;
144         }
145         if (!usedZiMu[c1]) 
146         {
147             usedZiMu[c1]=1;
148             pos[k++] = c1;
149         }
150     }
151     dfs(0);
152     return 0;
153 }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 由於System.Data.OracleClient.dll從.NET Framework4.0之後已被棄用,所以我們無法在.NET Framework高版本中使用。一番搜索之後,發現好多文章提到.NET連接Oracle需要安裝客戶端,安裝驅動,各種配置...感覺無比麻煩。 Oracle Entit ...
  • 一、 需求描述: mapreduce筆試題: 找出有共同好友的users usr:friend,friend,friend... A:B,C,D,F,E,O B:A,C,E,K C:F,A,D,I D:A,E,F,L E:B,C,D,M,L F:A,B,C,D,E,O,M G:A,C,D,E,F H ...
  • Razor Page介紹前言 上周期待已久的Asp.Net Core 2.0提前發佈了,一下子Net圈熱鬧了起來,2.0帶來了很多新的特性和新的功能,其中Razor Page引起我的關註,作為web程式員來說,Asp.Net下的任何web框架都會去特別關註,因為每次一個新的框架出來,意味著一次革命。... ...
  • 緩存資料庫介紹 NoSQL(Not Only SQL),即"不僅僅是SQL",泛指非關係型的資料庫。隨著互聯網web2.0網站的興起,傳統的關係資料庫在應對web2.0網站,特別是超大規模和高併發的SNS類型的web2.0純動態網站已經顯得力不從心,暴露了很多難以剋服的問題,而非關係型的資料庫則由於... ...
  • 學習Swift,從這裡開始! http://special.csdncms.csdn.net/the-swift-programming-language-in-chinese/index.shtml “輪子”工具類 SwiftyJSON:GitHub上最為開發者認可的JSON解析類 Dollar. ...
  • 狀態機 有限狀態機(Finite State Machine 或 Finite State Automata)是軟體領域中一種重要的工具。 狀態機允許一個對象在其內部狀態改變時改變它的行為。對象內部狀態決定行為方式,對象狀態改變行為方式改變,這裡強調內部狀態。 Command 模式是將命令請求封裝成 ...
  • 一:原題 二:原題講解 ...
  • / :為定界符,要匹配的字元一般放在定界符裡面; 2、 常用元字元 1)+:出現一次或多次 2)*:出現零次或多次 3)?:出現零次或一次 3、限定符 1) 字元1字元2{n} 表示字元2連續出現n次的匹配結果 字元1字元2{n,} 表示字元2連續出現n次或更多次的匹配結果 (字元1字元2){n} ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...