题意
中文题。
思路
本来直接先把水域存起来,之后再for遍历,遇到陆地就用这个陆地去搜所有的水域,然后,TLE。
正确的做法是 BFS ,我想到了但是我没写出来。我又以为是记忆化搜索。
补充
这里我用到pair,
放上我之前写的pair的用法:https://www.cnblogs.com/OFSHK/p/11788576.html。
AC代码
#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
#include<cmath>
#include<list>
#include<stdlib.h>
#include<map>
#include<vector>
#include<stack>
#include<string.h>
#include<stdio.h>
#include<queue>
using namespace std;
typedef long long ll;
#define sc(T) scanf("%d",&T)
#define scc(x,y) scanf("%d %d",&x,&y)
#define pr(T) printf("%d
",T)
#define f(a,b,c) for (int a=b;a<c;a++)
#define ff(a,b,c) for (int a=b;a>c;a--)
#define inf 0x3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
#define eps 1e-9
#define PI acos(-1)
const int N=805;
char a[N][N];
int n,m,ans[N][N],book[N][N];
int to[4][2]= {{0,-1},{0,1},{-1,0},{1,0}};
//struct node
//{
// int x,y;
//} w[160020];
queue<pair<int,int> >Q;
void bfs()
{
while(!Q.empty())
{
int x=Q.front().first,y=Q.front().second;
Q.pop();
for(int i=0; i<4; i++)
{
int tx=x+to[i][0],ty=y+to[i][1];
if(tx>=1&&tx<=n&&ty>=0&&ty<=m&&book[tx][ty]==-1)
book[tx][ty]=book[x][y]+1,Q.push({tx,ty});
}
}
}
int main()
{
scc(n,m);
int p=0;
for(int i=1; i<=n; i++)
{
scanf("%s",a[i]+1);
// for(int j=1; j<=m; j++)
// {
// if(a[i][j]=='0') //水域
// w[p].x=i,w[p++].y=j;
// }
}
mem(book,-1);
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
if(a[i][j]=='0')
book[i][j]=0,Q.push({i,j});
}
}
bfs();
// for(int i=1; i<=n; i++)
// {
// for(int j=1; j<=m; j++)
// {
// if(j==m)
// pr(ans[i][j]);
// else
// printf("%d ",ans[i][j]);
// }
// }
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
printf("%d%c",book[i][j],j==m?'
':' ');
}
return 0;
}