【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);
}

 

posted @ 2018-03-12 21:10  Misaka_Azusa  阅读(200)  评论(0)    收藏  举报
Live2D