2019 GDUT Winter Personal Training Contest I (Div. 2) A. Protect Sheep
题目见 :
http://codeforces.com/group/NVaJtLaLjS/contest/236426/problem/A
题目大意:
一个长宽分别为R,C(<=500)的长方形,里面有字符 s ——羊,w ——狼,. ——空地,你可以在空地放上任意数量狗,使得狼上下左右走无法到达羊吗?打出一种方案。
思路:
对于一种成功的方案,用狼作为起点进行dfs,判断能否到达羊。
一次优化:
题目没限制狗的数量,那就不妨把所有空地全部放上狗,这样狼就只能被堵在原地,这样只需判断狼的四周有没有羊即可。
实现:
#include<iostream>
#include<cstdio>
int main()
{
int n,r,c,k,t,i,j,p;
char s[550][550];
scanf("%d %d",&r,&c);
for (i=1;i<=r;i++)
{
scanf("%s",&s[i]);
for (j=c;j>=1;j--) s[i][j]=s[i][j-1];
}
for (i=0;i<=r+1;i++)
{
s[i][0]='.';
s[i][c+1]='.';
}
for (j=0;j<=c+1;j++)
{
s[0][j]='.';
s[r+1][j]='.';
}
p=0;
for (i=1;i<=r;i++)
for (j=1;j<=c;j++)
if (s[i][j]=='S'&&(s[i][j-1]=='W'||s[i][j+1]=='W'||s[i-1][j]=='W'||s[i+1][j]=='W'))
p=1;
if (p==1) printf("No\n");
else
{
printf("Yes\n");
for (i=1;i<=r;i++)
{
for (j=1;j<=c;j++)
if (s[i][j]=='.') printf("D"); else printf("%c",s[i][j]);
printf("\n");
}
}
return 0;
}