深搜
依舊是DFS。題的用語簡直不要太美國本土化,盡管公式以及前后兩句就足以明白題意,少一句話不明白都不得勁。。半個多小時用來完整翻譯。。
解題核心
-深搜函數(shù)遞歸結(jié)構(gòu),開頭判斷結(jié)束條件
-將字符串排序再搜索,因?yàn)樾枰值湫蜃畲蟮慕Y(jié)果
翻譯
Problem Description
=== "高科技簡報", 2002/11/02 06:42 美國中部時間 ===
"該物品被鎖在二樓圖書館的一幅畫后面的克萊因保險箱里。 克萊因保險箱是很罕見的,大多數(shù)都在二戰(zhàn)時期隨著克萊因和他的工廠損毀掉了。幸運(yùn)的是老布倫博在他死之前知道了克萊因的秘密并寫了下來??巳R因保險箱有兩個特點(diǎn): 一組用字母代替數(shù)字的密碼,和刻在門上的引文。一個克萊因引文總是包含5到10個大寫字母,通常在句子的開頭,提到1或多個數(shù)字。五種大寫字母的組合可以打開保險柜的密碼,以適當(dāng)?shù)男问桨阉鼈兘M合,你就可以得到一個目標(biāo)。(組合的細(xì)節(jié)是機(jī)密的)為了尋找組合,你必須選5個字母 "v, w, x, y, z"并滿足下面的方程,通過字母表中的字母序數(shù)(A=1, B=2, ..., Z=26)來替代。接著組合是 "vwxyz"。如果有多種解決方案,選擇字典序最大的結(jié)果"
v - w^2 + x^3 - y^4 + z^5 = target
"例如,給定1并且字母設(shè)定為ABCDEFGHIJKL,一個可能的解決方案是, "FIECB",因?yàn)?"6 - 9^2 + 5^3 - 3^4 + 2^5 = 1"。 顯然對于這組數(shù)據(jù)有多組解法,正確解是 "LKEBA"??巳R因認(rèn)為把密碼加密并雕刻在門上是安全的,因?yàn)榧词鼓阒肋@個秘密,也可能需要數(shù)月的努力去嘗試所有的可能性。但是顯然計算機(jī)那時并不存在。"( 阿塔納索夫 -> 馮諾依曼: ╮(╯-╰)╭,怪我們咯 )。
=== "高科技簡報", "計算機(jī)司", 2002/11/02 12:30 美國中部時間 ===
"現(xiàn)場設(shè)計一個程序來尋找克萊因的密碼組合,按部門規(guī)定使用標(biāo)準(zhǔn)測試方法,輸入一行或多行少于1200萬的正整數(shù),一個空格, 然后5~12個大寫字母。 結(jié)尾用 "0 END"來結(jié)束。
對于每個克萊因組合,打破字典關(guān)系(。。沒找到合適的用語來翻譯),如果沒有正確的組合,輸出'no solution'。
輸入輸出精確格式如下"
Sample Input
1 ABCDEFGHIJKL
11700519 ZAYEXIWOVU
3072997 SOUGHT
1234567 THEQUICKFROG
0 END
Sample Output
LKEBA
YOXUZ
GHOST
no solution
AcceptCode
/*
* Created by zsdostar in 2016/5/2
*/
//v - w^2 + x^3 - y^4 + z^5 = target
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
bool cmp(char a,char b);
bool compare(int v,int w,int x,int y,int z);
void dfs(int step);
int len;
char letter[13];
char letterFinal[13];
int letterToNum[13];
int book[13];
int target,flag;
int main()
{
while(cin>>target>>letter)
{
if(target==0 && strcmp(letter,"END")==0) break;
memset(book,0,sizeof(book));
memset(letterToNum,0,sizeof(book));
flag = 0;
len = strlen(letter);
sort(letter,letter+len,cmp);
dfs(0);
if(flag==0) cout<<"no solution"<<endl;
}
}
void dfs(int step)
{
if(flag==1) return;
if(step==5)
{
if(compare(letterToNum[0],letterToNum[1],letterToNum[2],letterToNum[3],letterToNum[4]) )
{
for(int k=0;k<5;k++)
cout<<letterFinal[k];
cout<<endl;
flag=1;
}
return;
}
for(int i=0;i<len;i++)
{
if(book[i] == 0)
{
book[i] = 1;
letterFinal[step] = letter[i];
letterToNum[step] = letterFinal[step]-'A'+1;
dfs(step+1);
book[i] = 0;
}
}
}
bool compare(int v,int w,int x,int y,int z)
{
if( (v - w*w + x*x*x - y*y*y*y + z*z*z*z*z) == target)
return true;
return false;
}
bool cmp(char a,char b)
{
return a>b;
}
函數(shù)傳參指針神馬的都去GoDead吧,全局變量才是真愛( ̄▽ ̄)"