YIDABANG大什路果看一下

CSDN問答 2021-12-30 06:50:07 阅读数:702

yidabang 看一下 一下

牧場安全系統
問題描述:明明是一家養牛場的老板,隨著養牛場的規模擴大,牛的數量變得越來越多。因此,管理也就越來越難,還時常發生一些事故,比如:一些牛會走失,一些牛會因為疏忽照顧而生長不佳等等,這些都給明明造成了損失。於是,明明决定給養牛場安裝一套現代化的生產管理系統,用科學的方法來管理養牛場,在這套安全系統中,需要為每頭牛編一個號碼,這個號碼是唯一的,用來標識每一頭牛。這樣明明在管理時,就不會疏忽任意一頭牛,也不會使牛再次走失。但是在給每頭牛編號的時候,明明遇到了困難,由於系統的原因,系統對每頭牛的編號有一定的限制,這個編號必須有L個小寫字母組成,這些小寫字母必須在固定的幾個字母中選擇,並且在這個編號中至少要有一個元音(‘a’, ‘e’, ‘i’, ‘o’, 或者 ‘u’),至少有兩個輔音(除去元音以外的音節), 並且字母按字母錶順序排列(例如,'abc’是有效的,而’bac’不是有效的)。 例如:假設編號由5個小寫字母組成,且這些小寫字母只能為a、b、c、d、e、f,這樣構成的可能的編號就有以下6種: bcdef acdef abdef abcef abcdf abcde 明明覺得這樣編號的方法非常麻煩,僅僅靠手工排列是很難完成的,出錯的可能性很大,這時,明明想起了你,你是一比特程序設計專家,你能否幫明明寫一個程序,幫助他按照編號的規則,由程序生成所有的有效編號,供明明使用。 明明的問題可以歸結為:給你一個有效編號的長度L,和C個可用的小寫字母,按照編碼規則生成所有的有效編號。

輸入說明:你寫的程序要求從標准輸入設備中讀入測試數據作為你所寫程序的輸入數據。標准輸入設備中有多組測試數據,每組測試數據有二行,第一行為兩個整數L(3≤L≤15)和C(3≤C≤26),L錶示編號的長度,C錶示可以選擇的小寫字母的數量,L和C用一個空格隔開。第二行有C個兩兩不相同的小寫字母,相互以一個空格隔開。每組測試數據與其後一組測試數據之間沒有任何空行,第一組測試數據前面以及最後一組測試數據後面也都沒有任何空行。

輸出說明:對於每一組測試數據,你寫的程序要求計算出一組相應的運算結果,並將這一組運算結果作為你所寫程序的輸出數據依次寫入到標准輸出設備中。每組運算結果分為兩個部分,第一部分為所有生成的有效編號,每行一個,按字母錶逆序順序輸出,第二部分為一個整數,錶示總共有多少個有效編碼。 每組運算結果的行首和行尾都沒有任何空格,每組運算結果與其後一組運算結果之間有一個空行,最後一組運算結果後面沒有空行。 注:通常,顯示屏為標准輸出設備。

輸入範例:
3 3
a b c
5 6
a b c d e f

輸出範例:
abc
1

bcdef
acdef
abdef
abcef
abcdf鍋
abcde
6




采納答案:

這個題目,看你放了很久了,我幫你做了,你運行下試試看
思想就是先正常統計有多少可能,然後反過來輸出
用遞歸的方法對每一比特嘗試

#include<iostream>#include<vector>using namespace std;vector<string>res;int cmp(const void* _a, const void* _b) //參數格式固定{ char* a = (char*)_a; //强制類型轉換 char* b = (char*)_b; return *a - *b;}bool isLegal(string s) { int num1 = 0, num2 = 0; for (char c : s) { if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') num1 += 1; else if (c >= 'a' && c <= 'z') num2 += 1; if (num1 >= 1 && num2 >= 2) return true; } if (num1 < 1 || num2 < 2) return false; else return true;}//回溯法:即遞歸 head代錶目前要放置元素的比特置void backTrack(string target, string resultStr, int m, int head) { if (resultStr.size() == m) { //至少含有1個原音 a e i o u,至少含有2個其它字符 if(isLegal(resultStr)) res.push_back(resultStr); return; } int targetLength = target.length(); int resultStrLength = resultStr.size(); int limit = resultStrLength + targetLength - m; for (int i = head; i < targetLength; i++) { if (limit< i) return; backTrack(target, resultStr + target[i], m, i + 1); }}int main() { int length, kinds;// [3,15] [3,26] char String[27] = "\0"; while (cin >> length >> kinds) { for (int i = 0; i < kinds; i++) cin >> String[i]; String[kinds] = '\0'; //排序 小到大 如果速度慢就注釋下面這句話 qsort(String, kinds, sizeof(char), cmp); res.clear(); backTrack(string(String), "", length, 0); for (int i = res.size() - 1; i >= 0; i--) { cout << res[i] << endl; } cout << res.size() << endl; }}


其他答案2:

標記一下


其他答案3:

img

版权声明:本文为[CSDN問答]所创,转载请带上原文链接,感谢。 https://primo.wiki/2021/12/202112281540495531.html