搜尋 (未完 2018 05 02更新

2021-08-18 14:24:42 字數 4394 閱讀 6438

好奇怪的遊戲(bfs

#include#include#include#includeusing namespace std;

int x1,x2,y1,y2;

queueqx;

queueqy;

int xx[15] =;

int yy[15] =;

int dis[120][120];

int main()

for(int i=0;i<12;i++)

}} }

return 0;

}

神奇的四次方數

思路:(來自題解。。。

完全揹包固然是正解,但萬一比賽時我們腦子瓦特想不出正解怎麼辦呢?

那就是我們的爆搜出場的時候了!(滑稽)

但是純爆搜顯然是不行的,m<=100000,這個資料範圍很有可能得不了高分甚至爆0,所以我們就要進行一些優化。

首先是剪枝。我們可以用 ans 存下當前的最好答案,如果在搜尋時當前選的數的數量已經大於ans了,那肯定就沒必要找了,這樣是白費力氣。另外,1^4+2^4和2^4+1^4是一樣的,我們用乙個last讓選出的數列變成公升序,同樣可以減少時間消耗。

另外搜的順序非常重要。如果我們從1往上搜,那第乙個選出來的肯定是全1的序列。這種情況我們肯定不想要,希望直接將其剪枝。那麼怎麼操作呢?結合剛才說的,我們可以確定乙個嬌小較小的ans,然後之後的搜尋肯定不會超過這個步數。沒錯,從最大往小的搜可以很好地完成這個任務。如果不這樣的話只會有30分。

#includeusing namespace std;

int n;

int ans=999999;

void dfs(int tot,int k,int last)

int i;

for(i=last;i*i*i*i<=n-tot;) i++;

for(;i>=last;i--)

dfs(tot+i*i*i*i,k+1,i);

}int main()

;int yy[8] = ;

void dfs(int x,int y) }

}int main()

} int ans = 0;

for(int i=1;i<=n;i++)

}} printf("%d\n",ans);

return 0;

}

選數

#include#include#includeusing namespace std;

int ans=0,n,k,x,a[21],num=0;

bool p(int q)

return true;

}void dfs(int x,int y)//定義深搜的函式,y是當前最後選過的數在陣列中的位置,x是當前正在選擇第幾個數,和用num變數儲存

}int main()

字串(bfs

#include#include#includeusing namespace std;

int n,ans;

void dfs(int now,int s,int l) // now 表示0 or 1 s 表示相鄰的個數 l 判斷是否結束

if(s<2) dfs(now,s+1,l+1);

dfs(now^1,1,l+1);

}int main()

去看電影(dfs

#include#include#includeusing namespace std;

int a[20];

bool vis[20];

int n,m,maxx=-1;

void dfs(int k,int ans)

vis[i] = 0;

ans -= a[i];

} }

} int main()

dfs(1,0);

cout《傳球( 搜尋 40分。。。

#include#include#includeusing namespace std;

int n,m,ans = 0;

queueq1,q2;

void bfs()

}int main()

if(n == 0)

return 0;

while(!q.empty())

cout《超級書架2(dfs

#include#includeusing namespace std;

int a[120];

bool vis[120];

int n,m;

int ans = 1e9;

void dfs(int sum)

for(int i=1;i<=n;i++) }

}int main()

dfs(0);

cout《放蘋果(遞迴

這道題其實就是乙個分類討論+遞迴,你可以選擇有乙個盤子乙個蘋果都不放,然後盤子數減1,或者(不可能兩種方案都不選)每個盤子都放乙個蘋果,即蘋果減去盤子的數量,就一直這樣遞迴下去,就得到了最終的答案。注意:有0個蘋果或1個盤子時,只有一種方案,所以(n==0||m==1)return 1,當n<0或m<1時,因為根本不存在這種情況,所以返回乙個0

#include#includeusing namespace std;

int t,n,m;

int solve(int n,int m)

int main()

;int yy[4] = ;

queueqx,qy;

int pd(int x,int y)

void bfs()

} }}int main()

if(a[i][j] == 'd')

}} vis[tx][ty] = 1;

dis[tx][ty] = 0;

qx.push(tx);

qy.push(ty);

bfs();

if(dis[enx][eny] == 1e9)

cout<<"no way!"《海戰(dfs

先預處理判斷是否是不可行的情況,我們由題意可以知道,不可行的情況為兩個船挨在了一起,即存在不是矩形的乙個圖案的情況。我們又可以知道,在乙個 2*2 的矩形中,若在三個地方都是#,那麼就一定存在不是矩形的情況,直接輸出,bad placement.

#include#include#includeusing namespace std;

int a[1010][1010];

bool vis[1010][1010];

int n,m;

int xx[4] = ;

int yy[4] = ;

int pd(int x,int y)

void dfs(int x,int y) }}

int main()

} for(int i=1;i<=n;i++)

catch that cow(改錯改了好久,**!

#include#include#include#includeusing namespace std;

int visit[100005] = ;

int main()

if(t > 0 && !visit[t-1])

if(t < m &&!visit[t+1])

if(t*2 < 100005 && !visit[t*2])

}printf("%d\n",visit[m]);

}return 0;

}

poj 1426(列舉 0 1 字串即可

#include#includeusing namespace std;

long long n;

queueq;

void bfs()

}

51 nod 1109 ( poj 1426 加強版 

部落格位址

#include#include#include#includeusing namespace std;

struct node

cur,nxt;

bool v[1000001];

queueq;

int main()

;int yy[4] = ;

struct nodenode[50];

int pd(int x,int y)

void bfs(int x,int y)

t = node[t].nex;

}} for(int i=0;i<4;i++)

} }}

int main()

} bfs(0,0);

return 0;

}

linux cmake(未完,待更新)

參考 栗子 1 project es 2 set cmake build type debug cache string set build type to debug 3 set cmake c compiler g 4 set cmake cxx flags g 5 add compile op...

未完成 POJ搜尋

記錄乙個菜逼的成長。ps 做搜尋時,是選擇深搜還是廣搜又或者結合在一起,真的很重要。bfs 1.給操作,求運算元 2.求最短路徑。poj3414 bfs 題目大意 有兩個容量為a,b的罐,有三種操作 實際上有六種 問能否使得其中的乙個罐裝滿c容量。poj1753 位壓縮 bfs 題目大意 有乙個4 ...

C 面試常考題(未完整 更新中)

1.static用法 在函式名裡定義的static變數,改變它的儲存結構,多次呼叫該函式時,該變數僅被初始化一次 全域性變數與static的靜態變數。改變它的作用域,全域性變數的範圍是整個程式,而static的靜態變數的範圍僅有該模組 2.多型的機制 編繹器會為繼承體系上的每乙個類建立乙個虛函式表,...