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

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

HDOJ(HDU).1015 Safecracker (DFS)

2019-11-14 09:19:12
字體:
來源:轉載
供稿:網友

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。可能有多組解,只輸出字典序最大的那個。

嗨呀一看到這道題,是否有種似曾相識的感覺。很像 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題,此題的收獲就在于:原先的地圖四向搜索,也可以變成這樣從幾個字符,數字中尋找可行的解?;顚W活用,非常重要呀!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
992tv在线成人免费观看| 国产欧美精品一区二区| 亚洲国产精品久久久久秋霞蜜臀| 亚洲欧洲xxxx| 欧美性猛交xxxx乱大交3| 92福利视频午夜1000合集在线观看| 欧美精品在线极品| 北条麻妃99精品青青久久| 成人免费网视频| 国产成人自拍视频在线观看| 2019中文字幕在线免费观看| 中文字幕在线视频日韩| 精品国产欧美成人夜夜嗨| 国产精品成人va在线观看| 日本精品久久久久久久| 亚洲一区二区中文字幕| 国内精品久久久久伊人av| 亚洲人高潮女人毛茸茸| 欧美另类极品videosbest最新版本| 亚洲精品www久久久久久广东| 久久久久久久久久国产| 国产精品高潮呻吟久久av野狼| 日韩欧美国产成人| 欧美成人午夜免费视在线看片| 亚洲欧美综合精品久久成人| 久久久久成人精品| 欧美日韩精品在线| 久久精品91久久香蕉加勒比| 国产在线观看一区二区三区| 亚洲欧美一区二区三区在线| 亚洲一区二区在线| 91人成网站www| 中文字幕日韩欧美在线| 日韩禁在线播放| 欧美大片va欧美在线播放| 欧美精品一区在线播放| 日韩av综合网站| 欧美日韩国产影院| 亚洲欧美日韩一区二区在线| 国内精品小视频在线观看| 国产亚洲欧美一区| 亚洲女人被黑人巨大进入| 国产精品一区二区久久久| 亚洲精品456在线播放狼人| 国产精品久久电影观看| 国内精品400部情侣激情| 日韩欧美aⅴ综合网站发布| 亚洲免费伊人电影在线观看av| 尤物tv国产一区| 一区二区三区国产在线观看| 亚洲免费人成在线视频观看| 欧美高清视频在线| 国产999视频| 欧美日韩国产在线| 国产精品青青在线观看爽香蕉| 亚洲免费视频在线观看| 国产精品一区二区三区在线播放| 亚洲一区二区三区久久| 欧美久久精品一级黑人c片| 亚洲黄色在线看| 精品视频久久久久久久| 精品国产乱码久久久久酒店| 国产亚洲视频中文字幕视频| 欧美亚洲午夜视频在线观看| 另类美女黄大片| 久久久久久久亚洲精品| 中文字幕久久亚洲| 欧美一级大片在线免费观看| 国产精品视频大全| 午夜免费久久久久| 姬川优奈aav一区二区| 一区二区av在线| 成人女保姆的销魂服务| 色琪琪综合男人的天堂aⅴ视频| 一区二区三区在线播放欧美| 亚洲免费伊人电影在线观看av| 中文字幕日韩欧美在线视频| 欧美高跟鞋交xxxxxhd| 亚洲欧美在线看| 日韩中文在线不卡| 国产精品中文久久久久久久| 日韩毛片中文字幕| 亚洲视频一区二区三区| 精品福利樱桃av导航| 亚洲天堂av在线免费观看| 国语自产精品视频在线看| 亚洲国产美女精品久久久久∴| 久久亚洲精品小早川怜子66| 久久久久日韩精品久久久男男| 久久久国产精品视频| 91久久精品美女高潮| 欧美巨猛xxxx猛交黑人97人| 成人写真福利网| 亚洲欧美国产日韩天堂区| 精品免费在线观看| 亚洲欧洲自拍偷拍| 日韩精品电影网| 91经典在线视频| 亚洲精品美女久久久久| 日韩美女av在线免费观看| 国产精品久久久久久五月尺| 91日本在线观看| 国产精品成人免费视频| 91免费综合在线| 久久精品视频导航| 亚洲精品电影久久久| 欧美激情国产高清| 亚洲色图av在线| 日韩在线观看免费高清| 91探花福利精品国产自产在线| 色妞在线综合亚洲欧美| 国产成人在线亚洲欧美| 亚洲免费视频在线观看| 亚洲欧美激情另类校园| 欧美大秀在线观看| 福利微拍一区二区| 亚洲一品av免费观看| 久久久国产视频91| 日韩在线观看免费全集电视剧网站| 欧美疯狂做受xxxx高潮| 国产精品免费观看在线| 最新国产精品亚洲| 一区二区三区美女xx视频| 欧美精品激情blacked18| 国产精品偷伦视频免费观看国产| 久久久av网站| 最好看的2019的中文字幕视频| 97久久国产精品| 中国日韩欧美久久久久久久久| 亚洲男人天堂2023| 成人免费黄色网| 91久久在线视频| 欧美疯狂xxxx大交乱88av| 亚洲激情视频网| 亚洲美女黄色片| 亲子乱一区二区三区电影| 国产精品一区二区三区久久| 亚洲人成在线观| 97国产在线观看| 亚洲国产高潮在线观看| 日韩精品日韩在线观看| 成人观看高清在线观看免费| 欧洲成人性视频| 精品国偷自产在线| 国产精品久久久久久网站| 国产精品九九九| 成人444kkkk在线观看| 精品成人国产在线观看男人呻吟| 国产精品日韩av| 精品亚洲男同gayvideo网站| 欧美疯狂性受xxxxx另类| 亚洲а∨天堂久久精品9966| 日韩有码在线播放| 91豆花精品一区| 成人天堂噜噜噜| 4438全国亚洲精品在线观看视频| 亚洲欧美一区二区三区久久| 久久久97精品| 亚洲精品v欧美精品v日韩精品| 国产精品影院在线观看| 国产丝袜视频一区| 日韩免费观看高清| 欧美电影免费播放| 日韩成人在线播放|