タイトルリンク: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;
}