【luogu Pxxxx 各种DFS水题】
因为自己搜索弱菜,逼着自己刷搜索
T1 马的遍历:
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstring> 5 #include <iomanip> 6 using namespace std; 7 int g[401][401]; 8 int n,m,sx,sy; 9 int k = 1; 10 void dfs(int x, int y, int step) 11 { 12 if(step>200) return; 13 14 g[x][y] = step; 15 16 if((x+1)<=n&&(y-2)>0&&(g[x+1][y-2]==-1||g[x+1][y-2]>step+1)) dfs(x+1,y-2,step+1); 17 if((x+1)<=n&&(y+2)<=m&&(g[x+1][y+2]==-1||g[x+1][y+2]>step+1))dfs(x+1,y+2,step+1); 18 19 if((x+2)<=n&&(y-1)>0&&(g[x+2][y-1]==-1||g[x+2][y-1]>step+1)) dfs(x+2,y-1,step+1); 20 if((x+2)<=n&&(y+1)<=m&&(g[x+2][y+1]==-1||g[x+2][y+1]>step+1))dfs(x+2,y+1,step+1); 21 22 if((x-2)>0&&(y+1)<=m&&(g[x-2][y+1]==-1||g[x-2][y+1]>step+1)) dfs(x-2,y+1,step+1); 23 if((x-2)>0&&(y-1)>0&&(g[x-2][y-1]==-1||g[x-2][y-1]>step+1)) dfs(x-2,y-1,step+1); 24 25 if((x-1)>0&&(y+2)<=m&&(g[x-1][y+2]==-1||g[x-1][y+2]>step+1)) dfs(x-1,y+2,step+1); 26 if((x-1)>0&&(y-2)>0&&(g[x-1][y-2]==-1||g[x-1][y-2]>step+1)) dfs(x-1,y-2,step+1); 27 } 28 int main() 29 { 30 cin>>n>>m>>sx>>sy; 31 memset(g,-1,sizeof(g)); 32 33 dfs(sx,sy,0); 34 35 for(int i = 1; i <= n; i++) 36 { 37 for(int j = 1; j <= m; j++) 38 printf("%-5d",g[i][j]); 39 //cout<<g[i][j]<<setw(5); 40 cout<<endl; 41 } 42 }
T2 跳马问题:
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 using namespace std; 5 int n,m,ans = 0; 6 void dfs(int x,int y) 7 { 8 if(x==m&&y==n) 9 { 10 ans++; 11 return ; 12 } 13 14 if(x+1>=0&&y-2>=0&&(x+1)<=m&&(y-2)<=n) 15 dfs(x+1,y-2); 16 17 if(x+1>=0&&y+2>=0&&x+1<=m&&y+2<=n) 18 dfs(x+1,y+2); 19 20 if(x+2>=0&&y-1>=0&&x+2<=m&&y-1<=n) 21 dfs(x+2,y-1); 22 23 if(x+2>=0&&y+1>=0&&x+2<=m&&y+1<=n) 24 dfs(x+2,y+1); 25 } 26 int main() 27 { 28 cin>>n>>m; 29 dfs(0,0); 30 cout<<ans; 31 }
T3 拯救oibh总部
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstring> 5 using namespace std; 6 const int maxn = 1000; 7 int x, y, tot = 0; 8 char ch; 9 int map[maxn][maxn]; 10 void dfs(int m, int n) 11 { 12 if(m<0||n<0||m>x+1||n>y+1||map[m][n]) return; 13 map[m][n] = 2; 14 dfs(m+1,n); 15 dfs(m-1,n); 16 dfs(m,n+1); 17 dfs(m,n-1); 18 } 19 int main() 20 { 21 cin>>x>>y; 22 for(int i = 1; i <= x; i++) 23 for(int j = 1; j <= y; j++) 24 { 25 cin>>ch; 26 if(ch == '0') 27 map[i][j] = 0; 28 else map[i][j] = 1; 29 } 30 dfs(0,0); 31 for(int i = 1; i <= x; i++) 32 for(int j = 1; j <= y; j++) 33 { 34 if(!map[i][j]) 35 tot++; 36 } 37 printf("%d",tot); 38 return 0; 39 }
T4 吃奶酪:
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #pragma GCC optimize(2) using namespace std; double ans = 1<<30, n, s[20][2]; bool used[20]; double q(double x1, double y1, double x2, double y2) { double xy = sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); return xy; } void dfs(int step, double now ,int cnt) { if(now > ans) { return ; } if(step == n+1) { ans = min(ans,now); return ; } for(int i = 1; i <= n; i++) { if(!used[i]) { used[i] = 1; now+=q(s[cnt][0],s[cnt][1],s[i][0],s[i][1]); dfs(step+1,now,i); now-=q(s[cnt][0],s[cnt][1],s[i][0],s[i][1]); used[i] = 0; } } } int main() { scanf("%lf",&n); s[0][0] = 0, s[0][1] = 0; for(int i = 1; i <= n; i++) scanf("%lf%lf",&s[i][0],&s[i][1]); dfs(1,0,0); printf("%0.2lf",ans); }
隐约雷鸣,阴霾天空,但盼风雨来,能留你在此。
隐约雷鸣,阴霾天空,即使天无雨,我亦留此地。

浙公网安备 33010602011771号