亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

HDOJ(HDU).1015 Safecracker (DFS)

2019-11-11 07:26:48
字體:
來源:轉載
供稿:網友

HDOJ(HDU).1015 Safecracker [從零開始DFS(2)]

從零開始DFS HDOJ.1342 Lotto [從零開始DFS(0)] — DFS思想與框架/雙重DFS HDOJ.1010 Tempter of the Bone [從零開始DFS(1)] —DFS四向搜索/奇偶剪枝 HDOJ(HDU).1015 Safecracker [從零開始DFS(2)] —DFS四向搜索變種 HDOJ(HDU).1016 PRime Ring Problem (DFS) [從零開始DFS(3)] —小結:做DFS題目的關注點 HDOJ(HDU).1035 Robot Motion [從零開始DFS(4)]—DFS題目練習 HDOJ(HDU).1241 Oil Deposits(DFS) [從零開始DFS(5)] —DFS八向搜索/雙重for循環遍歷 HDOJ(HDU).1258 Sum It Up (DFS) [從零開始DFS(6)] —DFS雙重搜索/去重技巧 HDOJ(HDU).1045 Fire Net [從零開始DFS(7)]—DFS練習/check函數的思想

題意分析

首先默認有個字母到數字的映射,A=1,B=2,C=3 …… Z=26,給出你一個目標數字target,然后給出一串字母,要求從這些字母中選取5個數字vwxyz,滿足 v - w^2 + x^3 - y^4 + z^5 = target??赡苡卸嘟M解,只輸出字典序最大的那個。

嗨呀一看到這道題,是否有種似曾相識的感覺。很像 HDOJ.1342 Lotto [從零開始DFS(0)]這道題。題目的大意都是選數字,滿足某種要求。我們分析一下這道題和HDOJ.1342的異同:

1.HDOJ.1342給出的數據是有序的因此我們直接想選擇/不選,找到解的時候就直接是按照字典序由小到大輸出的。 但是本題給出來的字母的序列是無序的因此想要只輸出一組字典序最大的解就需要按照降序排序,然后再處理。

2.HDOJ.1342中每個數字面臨的情況是選或者不選,只要位數湊夠6即可。但是此題不能按照這樣的想法,因為按照順序判定選或者不選的時候,這樣可能丟解。舉個例子: 給定的字母序列(已經按照降序排列好):ZXVUNMDBA 按照之前的思路,我們只需要依次判定Z選/不選,X選/不選……A選/不選。把選定的5個數字依次填在v, w, x, y, z的位置上。但是如果 ZBVUN是一組解的話,按照上面的思路根本搜索不到。

Tip:B明顯比V小

解決方法:想起 HDOJ.1010 Tempter of the Bone [從零開始DFS(1)]中的4方向搜索的環節了嗎?只需要對dfs函數稍加改動,再用visit數組判斷是否選擇過此數字即可。

HDOJ.1010 中的四方向搜索:

for(int i = 0;i<4;++i){ if(!visit[x+spx[i]][y+spy[i]]&&!judge){ dfs(x+spx[i],y+spy[i],s+1); visit[x+spx[i]][y+spy[i]] = false; } }

Tip: 我們按照這樣式的,采用for循環來實現。

上代碼,掰開了揉碎了慢慢來。。

代碼總覽

/* HDOJ.1015 Author:pengwill Date:2017-2-5*/#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;char a[15], b[10];int visit[15];int n,num,len;bool judge = false;bool cmp(char a, char b){ return a>b;}void init(){ len = strlen(a); judge = false; memset(visit,0,sizeof(visit)); sort(a,a+len,cmp); for(int i = 0;i<len;++i){ a[i] = a[i] -'A' + 1; }}void lnit(){ for(int i = 0;i<5;++i) b[i] = b[i]+'A'-1;}bool check(){ if(n == b[0] - b[1]*b[1] + b[2]*b[2]*b[2] - b[3]*b[3]*b[3]*b[3] + b[4]*b[4]*b[4]*b[4]*b[4]){ judge = true; return true; }else return false;}void dfs(int depth){ //遞歸邊界 if(judge) return; if(depth == 5) {check(); return;} for(int i = 0;i<len;++i){ if(!visit[i]&&!judge){ b[depth] = a[i]; visit[i] = 1; dfs(depth+1); visit[i] = 0; } }}int main(){ //freopen("in.txt","r",stdin); while(scanf("%d %s",&n,a)&& !(n==0 && !strcmp(a,"END"))){ init(); dfs(0); lnit(); if(judge)printf("%s/n",b); else printf("no solution/n"); } return 0;}

main函數中完成了數據的讀入,init函數把字符數組a中的字母轉變成數字,lnit函數在最后輸出的時候把數組b中的答案又轉變成了字母,check函數就是檢查是否是滿足題目要求的解。關鍵在dfs函數。

void dfs(int depth){ //遞歸邊界 if(judge) return; if(depth == 5) {check(); return;} for(int i = 0;i<len;++i){ if(!visit[i]&&!judge){ b[depth] = a[i]; visit[i] = 1; dfs(depth+1); visit[i] = 0; } }}

不要忘記題目要求:找到一組字典序最大的解即可。首先是遞歸邊界,如果找到了解(judge為真),停止遞歸;亦或是當depth為5(代表找到了5個數字)的時候,用check函數判斷一下是否滿足題目要求。若都不滿足遞歸邊界,繼續搜索。 下面的for循環非常像dfs地圖的四向搜索,但是len指的是數據中給定的字母序列的長度。那么就指,下一個搜索的目標要在所有的字母序列中找,哪些可以作為搜索目標呢?首先就是這個字母沒有被選定過(!visit[i] )并且現在解還沒有找到(!judge)。 進入if后,首先把數組b中depth的位置賦值為a[i],代表我數組b選定了你a中i這個位置的數字(或者說是字母),并且在visit中置為選擇過了,dfs(depth+1)繼續尋找下一個位置的搜索目標。別忘了最后把visit[i]置為0(無后效性)。

相比前邊2題,此題的收獲就在于:原先的地圖四向搜索,也可以變成這樣從幾個字符,數字中尋找可行的解。活學活用,非常重要呀!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品国精品久久99热一| 久久午夜a级毛片| 成人久久久久久久| 亚洲毛茸茸少妇高潮呻吟| 国产亚洲精品91在线| 日韩人在线观看| 欧美黑人xxxⅹ高潮交| 亚洲毛片在线看| 久久亚洲电影天堂| 伦理中文字幕亚洲| 中文字幕亚洲情99在线| 欧美日韩人人澡狠狠躁视频| 精品女厕一区二区三区| 国产精品高潮呻吟久久av野狼| 国产精品一区电影| 国产精品永久免费视频| 久久久久久免费精品| 日本一欧美一欧美一亚洲视频| 久久99久久亚洲国产| 亚洲第一网站免费视频| 亚洲精品自拍第一页| 91极品女神在线| 中文字幕日韩在线播放| 懂色av中文一区二区三区天美| 欧美激情一区二区三区高清视频| 国产女人精品视频| 欧美精品videofree1080p| www.亚洲一二| 色综合亚洲精品激情狠狠| 欧美激情欧美激情在线五月| 欧美怡春院一区二区三区| 亚洲欧美精品一区| 国产视频久久久| 精品美女国产在线| 成人久久18免费网站图片| 久久久久久亚洲精品| 亚洲欧美资源在线| 久久韩剧网电视剧| 精品国产户外野外| 午夜精品一区二区三区在线视| 日韩成人xxxx| 国内精品久久久久久久久| 91午夜理伦私人影院| 国产成人精品免费久久久久| 亚洲电影成人av99爱色| 亚洲精选在线观看| 日韩精品在线视频观看| 国产精品96久久久久久又黄又硬| 国产精品一二三视频| 亚洲日本中文字幕| 日韩国产高清视频在线| 亚洲肉体裸体xxxx137| 国产精品久久久久9999| 欧美日本国产在线| 成人午夜黄色影院| 成人性生交xxxxx网站| 日韩欧美精品网站| 亚洲欧美一区二区三区四区| 国产欧美中文字幕| 亚洲成人a**站| 久久久久999| 国产精品日韩欧美| 国产欧美日韩最新| 国产精品自产拍高潮在线观看| 亚洲美女激情视频| 亚洲丝袜一区在线| 色777狠狠综合秋免鲁丝| 亚洲欧美日韩爽爽影院| 91在线|亚洲| 91夜夜揉人人捏人人添红杏| 日韩美女在线观看一区| 欧美激情aaaa| 欧美日本高清一区| 欧美性20hd另类| 97在线观看视频国产| 亚洲欧美国产制服动漫| 日韩成人激情影院| 欧美精品videos性欧美| 欧美黄色三级网站| 中文字幕日韩精品在线| 日韩av最新在线观看| 7777免费精品视频| 亚洲国产97在线精品一区| www.精品av.com| 国产精品亚洲自拍| 91精品视频一区| 日韩一区视频在线| 欧美日韩中国免费专区在线看| 欧美影院在线播放| 亚洲天堂网站在线观看视频| 亚洲国产三级网| 爽爽爽爽爽爽爽成人免费观看| 久久久久在线观看| 国产一区二区三区在线播放免费观看| 精品国产一区二区三区久久| 欧美亚洲国产另类| 国产亚洲人成网站在线观看| 国产精品精品视频| 91亚洲精品一区二区| 久久99国产精品久久久久久久久| 精品国内亚洲在观看18黄| 亚洲自拍中文字幕| 一区二区欧美亚洲| 91探花福利精品国产自产在线| 国产精品久久久久久一区二区| 91精品国产高清久久久久久久久| 国产精品十八以下禁看| 正在播放欧美一区| 亚洲成人激情小说| 国产午夜精品美女视频明星a级| 国产日韩精品电影| 日韩欧美一区二区三区| 欧美裸体男粗大视频在线观看| 国产精品白丝av嫩草影院| 91国内免费在线视频| 欧美午夜电影在线| www.亚洲一二| 国产欧美一区二区三区视频| 日韩视频中文字幕| 青青久久av北条麻妃海外网| 久久99精品久久久久久青青91| 久久高清视频免费| 91精品久久久久久久久不口人| 国产丝袜一区二区三区免费视频| 日韩欧美国产骚| 国产丝袜精品第一页| 欧美又大粗又爽又黄大片视频| 国产精品亚洲视频在线观看| 日韩欧美一区二区三区| 亚洲人成在线观看| 亚洲在线一区二区| 久久久精品国产| 欧美激情一区二区三区成人| 一区二区中文字幕| 欧美日韩电影在线观看| 欧美怡红院视频一区二区三区| 福利视频第一区| 精品国偷自产在线| 国产精品视频久久| 81精品国产乱码久久久久久| 精品久久久久久久久久| 北条麻妃在线一区二区| 97国产在线视频| 久久久久久国产免费| 亚洲人成77777在线观看网| 亚洲国产精久久久久久| 免费91在线视频| 国产区亚洲区欧美区| 最新中文字幕亚洲| 欧美性理论片在线观看片免费| 欧美亚洲激情在线| 91国产精品视频在线| 亚洲人成网站777色婷婷| 97精品免费视频| 亚洲影视九九影院在线观看| 奇米一区二区三区四区久久| 两个人的视频www国产精品| 韩日精品中文字幕| 日韩中文字幕视频| 久久偷看各类女兵18女厕嘘嘘| 亚洲欧洲偷拍精品| 国产精品视频久| 亚洲欧美日韩一区二区在线| 久久精品国产亚洲|