關於DFS幾道比較基礎的題

2021-09-25 03:59:15 字數 4213 閱讀 7445

題目一 fatmouse and cheese

題目大意就是說有乙個老鼠在n*n的網格當中每一步最多只能走k格 並且由於貓的存在每一次老鼠的移動都必須比路徑上乙個網格收集的乳酪多 問這條路徑上老鼠收集的乳酪最大值

sample input

3 11 2 5

10 11 6

12 12 7

-1 -1

sample output

37

ps: 終點的位置不是固定的 滿足上下左右都不存在比當前更大的網格的條件 即四周都比當前網格值小

#includeusing namespace std;

const int maxn=105;

int n,k,nx,ny;

int vis[maxn][maxn],dp[maxn][maxn];

int dx[4]=;

int dy[4]=;

int dfs(int x,int y)}}

return dp[x][y]=ans+vis[x][y];//已經走到了終點加上終點的值

}int main()

return 0;

}

題目二 字元的全排列問題 有n個字元 請你輸出該n個字元的全排列

sample input

1abc

sample output

a b c

a c b

b a c

b c a

c a b

c b a

#include#includeint n;

char a[15];

char re[15];

int vis[15];

void dfs(int step)

for(i=1;i<=n;i++)//遍歷每一種情況

}return ;

}int main(void)

return 0;

}

3.題目三 走迷宮

sample input

10 12

w…ww.

.www…www

…ww…ww.

…ww.

…w……w…w…

.w.w…ww.

w.w.w…w.

.w.w…w.

…w…w.

sample output

3

題目大意:w代表池塘 -代表水窪 八連通時表示該池塘積水 問有多少積水的池塘

用dfs搜尋w的周圍 若周圍有w 則置為- 直到搜尋完所有的點 圖中剩下的就是積水池塘的個數

#includeusing namespace std;

const int maxn=1e2+10;

int num=0,nx,ny,n,m;

char mp[maxn][maxn];

int dx=;

int dy=;

void dfs(int x,int y)}}

}int main()}}

printf("%d\n",num);

}return 0;

}

4.題目四 how many ways

這是乙個簡單的生存遊戲,你控制乙個機械人從乙個棋盤的起始點(1,1)走到棋盤的終點(n,m)。遊戲的規則描述如下:

1.機械人一開始在棋盤的起始點並有起始點所標有的能量。

2.機械人只能向右或者向下走,並且每走一步消耗一單位能量。

3.機械人不能在原地停留。

4.當機械人選擇了一條可行路徑後,當他走到這條路徑的終點時,他將只有終點所標記的能量

機械人一開始在(1,1)點,並擁有4單位能量,藍色方塊表示他所能到達的點,如果他在這次路徑選擇中選擇的終點是(2,4) 點,當他到達(2,4)點時將擁有1單位的能量,並開始下一次路徑選擇,直到到達(6,6)點。

我們的問題是機械人有多少種方式從起點走到終點。這可能是乙個很大的數,輸出的結果對10000取模。

sample input

16 6

4 5 6 6 4 3

2 2 3 1 7 2

1 1 4 6 2 7

5 8 4 3 9 5

7 6 6 2 1 5

3 1 1 3 7 2

sample output

3948

剛開始我的**走的路徑是上下左右然後選擇比當前儲存能量小的點搜下去直到終點 不過題目中表明了機械人只能往右或往下走 因此我們只要從左上角乙隻搜到右下角 然後右下角中的點儲存的值就是我們最終的路徑總數了

#include#define p 10000

int mp[120][120],vis[120][120];

int n,m,nx,ny;

long long dfs(int x,int y)}}

return vis[x][y];

}int main()

}printf("%lld\n",dfs(1,1));

}return 0;

}

dividing

sample input

1 0 1 2 0 0

1 0 0 0 1 1

0 0 0 0 0 0

sample output

collection #1:

can't be divided.

collection #2:

can be divided.

沒想到這道題居然還能使用廣搜的方法來做 之前用的是dp(轉換成多重揹包)

廣搜**

#include #include #include #include using namespace std;

#define n 2400

#define inf 0x3f3f3f3f//正無窮大

#define pi acos (-1.0)

#define eps 1e-8

#define met(a, b) memset (a, b, sizeof (a))

typedef long long ll;

int a[n], half, flag;

void dfs (int v, int index)

for (int i=index; i>=1; i--)}}

return;}

int main ()

flag = 0;

half = sum / 2;

dfs (0, 6);

if (flag) puts ("can be divided.");

else puts ("can't be divided.");

puts ("");

}return 0;

}

多重揹包**//這個好理解一些

#includeusing namespace std;

const int mmax=50000;

int f[mmax],k[mmax],v[7]= ,a[mmax];

int main()

if(sum==0)

break;

int hh=sum;

if(sum%2==1)

printf("collection #%d:\ncan't be divided.\n\n",op);

int index=0;

if(sum%2==0&&hh!=0)

if(k[i]>0)

a[++index]=v[i]*k[i];

}sum/=2;

for(i=1; i<=index; ++i)

if((hh-f[sum])!=sum)

printf("collection #%d:\ncan't be divided.\n\n",op);

if((hh-f[sum])==sum)

printf("collection #%d:\ncan be divided.\n\n",op);}}

return 0;

}

幾道比較難的SQL題

select from article where create timenow article time order by create time asc limit 1 select a.rownum rownum 1 as rowno from a,select rownum 3 b通過變數r...

dfs序入門 CF上的幾道題

由於我太菜了,做了好幾道題終於感覺自己算是入門了 cf 343d 線段樹時間戳 三個操作 1 v 把v和v的所有兒子染色 2 v 把v和v的所有父親取消染色 3 v 查詢某個節點顏色 做法 利用染綠色的性質,如果某個節點在某個時間t1被染綠,在時間t2被取消,那麼當且僅當t1 t2時這個時候他被染色...

關於C語言的幾道題

1.乙個陣列中只有兩個數字是出現一次,其他所有數字都出現了兩次。找出這兩個數字,程式設計實現。include include include void find data int a,int sz 異或得到後的數從最低位開始查詢為1的位元位 for i 0 i 32 i else 按指定的位元位是否...