zcmu1275: Seeding

题目链接:https://acm.zcmu.edu.cn/JudgeOnline/problem.php?id=1275

题目大意

长为n宽为m的草坪,“.”表示杂草,”S“表示石头,现在从(1,1)位置开始除草,每次可以上下左右移动,但是石头作为障碍物阻挡你前进,你应该选择绕路。问你最后能不能清理掉所有的杂草。

思路

从(1,1)位置开始跑dfs,看最大深度是不是n*m-cnt,cnt是石头个数。还要特判(1,1)位置是不是石头。

ac代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ok(x, y) x >= 1 && x <= n && y >= 1 && y <= m
int dx[] = {0, 0, -1, 1};
int dy[] = {-1, 1, 0, 0};
int vis[10][10];
char a[10][10];
int n, m, cnt, flag;
void dfs(int x, int y, int dep){
    if(dep == cnt){
        flag = 1;
        return;
    }
    for(int i = 0; i < 4; i ++){
        int tx = x + dx[i];
        int ty = y + dy[i];
        if(ok(tx, ty) && !vis[tx][ty] && a[tx][ty] != 'S'){
            vis[tx][ty] = 1;
            dfs(tx, ty, dep + 1);
            if(flag) return;
            vis[tx][ty] = 0;
        }
    }
}
int main(){
    while(~scanf("%d%d", &n, &m)){
        if(n + m == 0) break;
        cnt = n * m;
        memset(vis, 0, sizeof(vis));
        for(int i = 1; i <= n; i ++) {
            scanf("%s", a[i] + 1);
            for(int j = 1; j <= m; j ++){
                if(a[i][j] == 'S') cnt --;
            }
        }
        if(a[1][1] == 'S'){
            puts("NO");
            continue;
        }
        flag = 0;
        vis[1][1] = 1;
        dfs(1, 1, 1);
        if(flag) puts("YES");
        else puts("NO");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43911947/article/details/113280865