HihoCoder1478

题意

中文题。

思路

本来直接先把水域存起来,之后再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;
}
原文地址:https://www.cnblogs.com/OFSHK/p/13728034.html