CodeForces

来源:互联网 发布:java环境变量设置win7 编辑:程序博客网 时间:2024/06/05 00:39

预处理每一个 ‘ . ’ 的块(通过上下左右相连的),用 mp 二维数组存编号,,通过这个编号 存这个块含有的 ‘ . ’ 个数

最后输出


#include<iostream>#include<algorithm>#include<cstdio>#include<cstdlib>#include<cstring>#include<string>#include<cmath>#include<set>#include<queue>#include<stack>#include<map>using namespace std;typedef long long ll;const int maxn = 1e3 + 7, INF = 0x7f7f7f7f, mod = 1e9 + 7;int n, m, num;char s[maxn][maxn];int mp[maxn][maxn];bool vis[maxn][maxn];int ans[maxn*maxn] = {0};set<int> st;int dx[4] = {1, -1, 0, 0};int dy[4] = {0, 0, 1, -1};void dfs(int x, int y, int id) {    vis[x][y] = true; num++;    mp[x][y] = id;    for(int i = 0; i < 4; ++i) {        int nx = x + dx[i], ny = y + dy[i];        if(nx < 0 || nx >= n || ny < 0 || ny > m) continue;        if(!vis[nx][ny] && s[nx][ny] == '.') {            dfs(nx, ny, id);        }    }}int main() {    scanf("%d %d", &n, &m);    for(int i = 0; i < n; ++i) {        scanf("%s", s[i]);    }    int cnt = 1;    memset(vis, false, sizeof vis);    for(int i = 0; i < n; ++i) {        for(int j = 0; j < m; ++j) {            if(s[i][j] == '.' && !vis[i][j]) {                num = 0;                dfs(i, j, cnt);                ans[cnt++] = num;            }        }    }    for(int i = 0; i < n; ++i) {        for(int j = 0; j < m; ++j) {            if(s[i][j] == '.') printf(".");            else {                st.clear(); int anss = 0;                for(int k = 0; k < 4; ++k) {                    int nx = i + dx[k], ny = j + dy[k];                    if(nx < 0 || nx >= n || ny < 0 || ny > m) continue;                    if(st.count(mp[nx][ny])) continue;                    anss += ans[mp[nx][ny]]; st.insert(mp[nx][ny]);                }                cout << (anss+1)%10;            }        }        cout << endl;    }    return 0;}


原创粉丝点击