第一題:
本題涉及到深度搜尋(當然也可以廣度搜尋)+剪枝,典型的迷宮問題。問題的大概意思是,狗從s點出發,要求時間為t時狗正好到達d點,迷宮為n*m矩陣,迷宮內有x代表的牆。問狗能否在t時刻準時到達d點。我們要讓狗能在t時刻剛好到達門口,但是題目要求狗不能回走,只能繞路走,能繞路走可定要多出偶數的步數,就算是牆擋著也一樣如此,兩種剪枝優化:
1.下面那一種可以控制時間剛好在t時刻。因為差出的是偶數,所以奇數的話要剪枝掉,。
2.另乙個剪枝,是判斷一下,假如迷宮的每個地方都走過了,而還沒到t時刻,這時沒地方走了。
附上**:
#include
using
namespace
std;
const
int maxn=7+5;
int d[4][2]=,,,};
int t,s,c,xt,xs,yt,ys,ans,m,n;
bool flag;
int vis[maxn][maxn];
char st[maxn][maxn];
void dfs(int x,int y,int s)
int kp=(t-s)-abs(x-ys)-abs(y-yt);
if(kp<0||kp%2==1)
return;
for(int i=0;i<4;i++)
}int main()
vis[xs][xt]=1;
flag=false;
dfs(xs,xt,0);
if(flag)
puts("yes");
else
puts("no");
}return
0;}
第二題:
#include
using
namespace
std;
int a[70],n,f;
bool vis[70];
bool cmp(int a,int b)
void dfs(int pos,int len,int g,int num)
for(int i=pos;iif(vis[i]||a[i]+len>g)
continue;
vis[i]=1;
if(a[i]+len==g)
dfs(0,0,g,num+1);
else
dfs(i+1,a[i]+len,g,num+1);
vis[i]=0;//去除標記
if(f)
return;//找到了結果,返回
if(len==0)
return;//剪枝2,很關鍵!
while(i1]==a[i])
i++;//剪枝3
}}int main()
sort(a,a+n,cmp);//從大到小排序,搜尋的時候優先選擇大的,減少衝突的情況
for(int i=a[0];i<=sum;i++)}}
}return
0;}
搜尋(1) 剪枝
要製作乙個體積為n 的m層生日蛋糕,每層都是乙個圓柱體。設從下往上數第i 1 i m 層蛋糕是半徑為ri,高度為hi的圓柱。當i m時,要求ri ri 1且hi hi 1。由於要在蛋糕上抹忌廉,為盡可能節約經費,我們希望蛋糕外表面 最下一層的下底面除外 的面積q最小。令q s 請程式設計對給出的n和...
剪枝搜尋心得
前天在 程式設計之美 中讀到乙個 一摞烙餅排序 的問題,第一眼不會做,看了答案之後倒是讓我明白了一年多之前不真正理解的剪枝搜尋的內涵。記錄一下,作為分享和溫習之地。void cprefixsorting search int pcakesarray,int step if issorted pcak...
搜尋剪枝DFS
tempter of the bone hdu1010 題意 給乙個圖,找出乙個看能否能在t的時間內從s到達d點 思路 bfs肯定不行,因為bfs找到的是最短時間的路徑,無法對在t時間點到達d點進行判斷 於是才想到了dfs,這個能把所有的情況遍歷一遍的演算法,雖然圖的長寬只有7,但是總是超時,這次終...