搜尋題 醫生的藥方

2021-09-22 13:20:07 字數 1820 閱讀 8761

這道題最難的地方是當一種藥和它的乙個後續藥品出現後,如何防止其他的後續藥品在搜尋**現,因為搜尋的時候是按位置順序探測的,所以位置不是相鄰的時候,從下一層回退回來並不知道前面已經有這樣的狀態。剪枝的條件應該還有,我這個**還是很慢。

測試用例:

輸入:複製** 5

2 4 5

1 3 5

2 31 2 4 4

0 30 0

複製**

輸出: 2

2 3 5 4

4 3 5 1

複製**

#include

#include

#include

#include

using namespace std;

const int maxsize = 500;//最大藥品數目

vector> medicvect;//記錄每種藥品的後續藥

vector>answers;//記錄搜尋到的所有藥方

vectortarget;//當前藥方

vectoranswer;//當前解法

int n,p,ncount;

bool used[maxsize];//藥是否已經出現

int limit[maxsize];//若藥品及其後續藥出現了,則限制其他後續藥再次出現

bool is_succ(int x,int y)

} return result; }

int is_one_pred(int x)

else

} }

result = k;

return result; }

void limit_inc(int x)

} void limit_dec(int x)

} bool init()

for (i=2;i<=p-1;++i)

} }

//記錄已經知道的藥(被使用了,可不參與搜尋)

for (i=1;i<=p;++i)

} return true; }

void solve(int curpos)

if (target[curpos]==0)

answer[curpos] = num;//放入解法中

used[num] = true;//被使用了

solve(curpos+1);//進入下乙個位置的試探

used[num] = false;//從上一層回來,重置狀態

if (curpos>1)

} }

} else

} }

if (curpos>1)

answer[curpos] = target[curpos];//放入解法中

solve(curpos+1);//進入下乙個位置的試探

if (curpos>1)

} }

int main()

medicvect.push_back(firstvect);

//輸入每一種藥品的後續藥

for (i=0;i

else

} while (pos!=input.end());

medicvect.push_back(tmpvect); }

//輸入給定的藥方

cin>>p;

target.resize(p+1);

for (i=1;i<=p;++i)

if (!init())

else

cout<} }

system("pause");

return 0; }

複製**

搜尋題 醫生的藥方

這道題最難的地方是當一種藥和它的乙個後續藥品出現後,如何防止其他的後續藥品在搜尋中出現,因為搜尋的時候是按位置順序探測的,所以位置不是相鄰的時候,從下一層回退回來並不知道前面已經有這樣的狀態。剪枝的條件應該還有,我這個 還是很慢。測試用例 輸入 524 5135 2312 4403 00輸出 2 2...

簡單搜尋題!

設有乙個4 4的棋盤,用四個棋子布到格仔中,要求滿足以下條件 1 任意兩個棋子不在同一行和同一列上 試問有多少種棋局,程式設計把它們全部列印出來。如下 include include include include include using namespace std int n 4,m 4,us...

高校Web應用系統的安全「新藥方」

近幾年來,各大高校為了增強資訊化系統的社會服務功能和訪問的便捷性,都在向web應用模式轉型。為了保證這些web應用系統的安全,大多高校網也都部署了ssl安全 防火牆 ids ips 以及軟體防火牆 防病毒這類安全裝置。但是,高校網遭遇的惡性攻擊事件不僅沒有因此減少,反而還出現了大幅飆公升的趨勢。老三...