搜尋題 醫生的藥方

2021-08-29 17:48:52 字數 2399 閱讀 3019

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

測試用例:

輸入: 524

5135

2312

4403

00輸出: 2

2354

4351

#include

<

iostream

>

#include

<

vector

>

#include

<

string

>

#include

<

algorithm

>

using

namespace

std;

const

intmaxsize

=500;//

最大藥品數目

vector

<

vector

<

int>

>

medicvect;

//記錄每種藥品的後續藥

vector

<

vector

<

int>

>

answers;

//記錄搜尋到的所有藥方

vector

<

int>

target;

//當前藥方

vector

<

int>

answer;

//當前解法

intn,p,ncount;

bool

used[maxsize];

//藥是否已經出現

intlimit[maxsize];

//若藥品及其後續藥出現了,則限制其他後續藥再次出現

bool

is_succ(

intx,

inty)

}return

result;

}int

is_one_pred(

intx)

else}}

result=k;

return

result;

}void

limit_inc(

intx)

}void

limit_dec(

intx)

}bool

init()

for(i=2

;i<=p-

1;++i)}}

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

for(i=1

;i<=

p;++i)}

return

true;}

void

solve(

intcurpos)

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)

}}intmain()

medicvect.push_back(firstvect);

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

for(i=0

;i<

n;++

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

<<

endl;}}

system(

"pause");

return0;

}

搜尋題 醫生的藥方

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

簡單搜尋題!

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

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

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