這道題最難的地方是當一種藥和它的乙個後續藥品出現後,如何防止其他的後續藥品在搜尋**現,因為搜尋的時候是按位置順序探測的,所以位置不是相鄰的時候,從下一層回退回來並不知道前面已經有這樣的狀態。剪枝的條件應該還有,我這個**還是很慢。
測試用例:
輸入:複製** 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 以及軟體防火牆 防病毒這類安全裝置。但是,高校網遭遇的惡性攻擊事件不僅沒有因此減少,反而還出現了大幅飆公升的趨勢。老三...