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