HDU1560,迭代加深搜尋
第一次做迭代加深操作,看了題解之後,根據自己的理解做出來的,但是該程式還是不夠強大,比如討論中的測試資料:
1
8
AAAAA
CCCCC
TTTTT
GGGGG
CACAC
AGGGA
TTTTT
GAGGA,程式在進入到17層迭代的時候,就一直卡在那裡,不動了。由於該題資料比較水,所以還是以951Ms過了。
/*************************************************************************
> File Name: main.cpp
> Author:Eagles
> Mail:None
> Created Time: 2018年08月28日 星期二 20時32分32秒
> Description:HDU1560,迭代加深搜尋
************************************************************************/
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
#define N 9
int n;
char dna[4]={'A','C','G','T'};
char s[N][N];//記錄字串
int pos[N];//記錄每個字串已經匹配了幾個字元,初始化為0
int len[N];//記錄每個字串的長度
int deep;//迭代的深度
int ans;//最終的答案
int max(int a, int b)
{
return a>b?a:b;
}
//返回所有字串中,還未匹配的最大長度
int left()
{
int re=0;
for (int i=0; i<n; i++)
re=max(re,len[i]-pos[i]);
return re;
}
void dfs(int layer)
{
if (layer+left()>deep)
return;
if (left()==0)//如果所有未匹配的長度為0,則說明所有匹配完成
{
ans=layer;
return;
}
for (int i=0; i<4&&(ans == -1); i++)//四個字母
{
int flag=0;
int backup[N];//用作備份的陣列,如果下一層dfs不行,返回時,將pos陣列還原會dfs之前的樣子
for (int j=0; j<n&&(ans ==-1); j++)
{
backup[j]=pos[j];
if (dna[i]==s[j][pos[j]])//如果當前字串能夠匹配該字母
{
pos[j]++;
flag=1;//說明當前位置的字母至少能匹配一個字串
}
}
if (flag)
{
dfs(layer+1);
if (ans != -1)
return;
for (int j=0; j<n; j++)
pos[j]=backup[j];//回溯,講pos陣列復原
}
}
}
int main()
{
int t;
while(~scanf("%d",&t))
{
while(t--)
{
deep=0;
int sum=0;
scanf("%d",&n);
for (int i=0; i<n; i++)
{
scanf("%s",s[i]);
len[i]=strlen(s[i]);
pos[i]=0;
deep=max(deep,len[i]);
sum+=len[i];
}
ans=-1;
while(1)
{
dfs(0);
if (ans != -1)
{
printf("%d\n",ans);
break;
}
deep++;
}
}
}
return 0;
}
相關文章
- 高階搜尋演算法之迭代加深演算法
- LeetCode-173-二叉搜尋樹迭代器LeetCode
- 最佳路徑搜尋(二):啟發式搜尋(代價一致搜尋(Dijkstra search),貪心搜尋,A*搜尋)
- 海量資料搜尋---搜尋引擎
- 搜尋
- 搜尋引擎-03-搜尋引擎原理
- 搜尋引擎es-分詞與搜尋分詞
- 點選搜尋框清空搜尋提示文字
- 直播系統程式碼,常用搜尋中搜尋歷史,搜尋推薦功能
- 搜尋策略
- vim搜尋
- 搜尋功能
- 搜尋技巧
- 20240713總結(搜尋專題,但是不想搜尋)
- Elasticsearch(ES)的高階搜尋(DSL搜尋)(上篇)Elasticsearch
- Elasticsearch(ES)的高階搜尋(DSL搜尋)(下篇)Elasticsearch
- 搜尋的未來是精品搜尋 | a16z
- 直播開發app,實時搜尋、搜尋引擎框APP
- 谷歌搜尋用上BERT,10%搜尋結果將改善谷歌
- 啟發式搜尋的方式(深度優先,廣度優先)和 搜尋方法(Dijkstra‘s演算法,代價一致搜尋,貪心搜尋 ,A星搜尋)演算法
- Python之 常用查詢演算法:最小項搜尋、順序搜尋、二分搜尋Python演算法
- 搜尋插入位置
- 搜尋/查詢
- Google搜尋技巧Go
- Elasticsearch 向量搜尋Elasticsearch
- Elasticsearch常用搜尋Elasticsearch
- 貪心+搜尋
- elasticsearch搜尋商品Elasticsearch
- 單詞搜尋
- Elasticsearch——全文搜尋Elasticsearch
- 從二分搜尋到二叉搜尋樹
- Nebula 基於 ElasticSearch 的全文搜尋引擎的文字搜尋Elasticsearch
- Mac上神奇的內建搜尋引擎——Spotlight(聚焦搜尋)Mac
- 直播平臺開發,基礎搜尋方式之拼音搜尋
- MacOS的Safari搜尋欄無法搜尋怎麼解決?Mac
- 使用Google百度等搜尋引擎的常用搜尋技巧Go
- 雲搜尋服務在APP搜尋場景的應用APP
- chapter9-搜尋APT