例題一:
題目大意:約翰的農場被暴風雨給淹沒了,損失很大,他的保險公司將支付給他,但是支付金額取決於被淹沒的最大面積。這個農場是乙個邊長分別為n、m的矩形,包含nm個空間,每個空間要麼是幹的,要麼是被淹沒的,一共有k個空間被淹沒。求最大的淹沒面積。
ac**:
#include #include #include using namespace std;
int a[110][110];
int num[110];
int ans,n,m;
void dfs(int x,int y) //深度優先搜尋
int main()
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
}sort(num,num+ans+1); //快排
printf("%d\n",num[ans]);
} return 0;
}
例題二:
題目大意:春天來了,湯姆有一塊包含n*m個方塊良田,他有乙個耕種機器(位於左上角),但是其中有一些方塊田地有大石塊,機器不能通過,然而他想把沒有石塊的全部良田耕種,可能嗎?
題目分析:首先利用字串建立地圖,找出所以有石塊的田地並計數,然後從左上角搜尋沒有石塊的良田並標記計數,然後判斷下一塊田地是否可以耕種,以此類推,直到不能再耕種,判斷所記的數目是否等於所有田地的總數目,(考查深度優先搜尋)。
ac**:
#include #include char str[10][10];
int n,m,sum;
bool flag;
void dfs(int x,int y) //深度優先搜尋
dfs(x-1,y);
dfs(x+1,y);
dfs(x,y-1);
dfs(x,y+1);
sum--;
str[x][y]='.';
}int main()
puts("");
return ; }
return ;
}int main()
word[1000];
void dfs(char c) //深度優先搜尋
for(int i=1;i
例題五:
題目大意:在有若干個城牆的n*n的城市裡建立大炮,大炮威力很大,除了城牆都能打透,所以兩門大炮不能在同一行,或同一列,除非中間有城牆隔著,問最多能建立多少個大炮。
題目分析:從左上角開始搜尋,判斷是否能安排大炮(此位置的上方和左方不能有大炮,除非有城牆隔著),能安排大炮就標記並統計大炮數目,以此類推,直到所有地方不能安排大炮,輸出最多安排大炮的數量。
ac**:
#include #include #include using namespace std;
char str[5][5];
int t,sum;
bool vis(int x,int y) //判斷此位置的上方,左方是否有大炮或者城牆
for(i=y-1;i>=0;i--)
return true;
}void dfs(int x,int y)
}else
dfs(x+1,y); //搜尋數目+1
}}int main()
a[11];
void dfs(int x,int y,int z) //深度優先搜尋
if(y>z||x==m) //價值超出,不符合條件
return ;
for(int j=0;j<=a[x].num;j++)
dfs(x+1,y+j*a[x].value,z); //遞迴
}int main()
{ int n,i,b=-1;
while(~scanf("%d%d",&n,&m))
{ for(i=0;i
深度優先搜尋演算法(DFS)
1.深度優先搜尋屬於圖的遍歷演算法的一種,英文縮寫為dfs即depth first search.其過程簡要來說是對每乙個可能的分支路徑深入到不能再深入為止,而且每個節點只能訪問一次。2.搜尋策略 深度優先遍歷圖的方法是,從圖中某頂點v出發 1 訪問頂點v 2 依次從v的未被訪問的鄰接點出發,對圖進...
DFS 深度優先搜尋演算法
深度優先搜尋演算法 depth first search,簡稱dfs 一種用於遍歷或搜尋樹或圖的演算法。沿著樹的深度遍歷樹的節點,盡可能深的搜尋樹的分支。當節點v的所在邊都己被探尋過或者在搜尋時結點不滿足條件,搜尋將回溯到發現節點v的那條邊的起始節點。整個程序反覆進行直到所有節點都被訪問為止。屬於盲...
深度優先搜尋演算法DFS
深度優先搜尋每一次搜尋都要走到底的 從左到右遍歷,每一次遍歷從上到下遍歷完 深度優先搜尋主要用遞迴實現,因此也很容易超時.回溯演算法實際上乙個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就 回溯 返回,嘗試別的路徑。回溯法是一種選優搜尋法,按選優條件向前搜尋...