题解 洛谷P1913 【L国的战斗之伞兵】

很适合搜索入门

我竟然交了三次才过

此题用搜索

请原谅,我习惯把数组名叫DP

1.用一个数组DP[i][j]记录点(i,j)是否可行,这样可以避免很多的重复运算。初始化时将所有无风区设为true,其余设为false。

2.别看代码长,其实四个方向都很类似。

3.从每个点进去搜一遍。

4.搜索题小心出界。

#include<bits/stdc++.h>
using namespace std;
int n,m;
bool vis[1001][1001];
bool dp[1001][1001];
char a[1001][1001];
bool dfs(int x,int y)
{
    if(dp[x][y])
    {
        return true;
    }
    switch(a[x][y])
    {
        case 'u':
        {
            if(!vis[x-1][y]&&x>0&&y>0&&x<=n&&y<=m)
            {
                vis[x-1][y]=true;
                if(dfs(x-1,y))
                {
                    dp[x][y]=true;
                    vis[x-1][y]=false;
                    return true;
                }
                vis[x-1][y]=false;
            }
            break;
        }
        case 'd':
        {
            if(!vis[x+1][y]&&x>0&&y>0&&x<=n&&y<=m)
            {
                vis[x+1][y]=true;
                if(dfs(x+1,y))
                {
                    dp[x][y]=true;
                    vis[x+1][y]=false;
                    return true;
                }
                vis[x+1][y]=false;
            }
            break;
        }
        case 'l':
        {
            if(!vis[x][y-1]&&x>0&&y>0&&x<=n&&y<=m)
            {
                vis[x][y-1]=true;
                if(dfs(x,y-1))
                {
                    dp[x][y]=true;
                    vis[x][y-1]=false;
                    return true;
                }
                vis[x][y-1]=false;
            }
            break;
        }
        case 'r':
        {
            if(!vis[x][y+1]&&x>0&&y>0&&x<=n&&y<=m)
            {
                vis[x][y+1]=true;
                if(dfs(x,y+1))
                {
                    dp[x][y]=true;
                    vis[x][y+1]=false;
                    return true;
                }
                vis[x][y+1]=false;
            }
            break;
        }
    }
    return false;
}
int main()
{
    int i,j;
    cin>>n>>m;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            cin>>a[i][j];
            if(a[i][j]=='o')
            {
                dp[i][j]=true;
            }
        }
    }
    int sum=0;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            vis[i][j]=true;
            if(dfs(i,j))
            {
                dp[i][j]=true;
                sum++;
            }
            vis[i][j]=false;
        }
    }
    cout<<sum<<endl;
    return 0;
}
/*
5 5
rrrrr
rdddr
rroll
uuuuu
uuuuu
*/
View Code
posted @ 2020-08-08 15:27  Bushuai_Tang  阅读(115)  评论(0编辑  收藏  举报