http://codeforces.com/contest/616/problem/C
给出一个n*m图,
如 :
*.* .*. *.*
求 每个*周围连在一起的点“.”共有多少个,个数+上自己本身,也就是+1。
窝是直接dfs记忆化搜索,求出每个点“.”的联通量,然后标记在同一个联通块中的点通通为mark(唯一标记)
输出的时候,判断*周围四个方向的空点”.“所含的联通量,并判断一下不要重复计算了 【在同一联通块的点】
int n,m; char tm[1005][1005]; int num[1005][1005]; int dx[8]={0,0,1,-1}; int dy[8]={1,-1,0,0}; int vis[1005][1005]; queue< int* > sb; int who[1005][1005]; int dfs(int i,int j,int mmark) { if (num[i][j]) return num[i][j]; num[i][j]=1; vis[i][j]=1; who[i][j]=mmark; int *t=&num[i][j]; sb.push(t); int k,x,y; for (k=0;k<4;k++) { x=i+dx[k]; y=j+dy[k]; if (x>=1&&x<=n&&y>=1&&y<=m&&tm[x][y]=='.'&&vis[x][y]==0) { num[i][j]+=dfs(x,y,mmark); } } return num[i][j]; } int main() { cin>>n>>m; int i,j; int minnn=2147483647; for (i=1;i<=n;i++) { scanf("%s",tm[i]+1); } int x,y,k; int mark=1; for (i=1;i<=n;i++) { for (j=1;j<=m;j++) { if (tm[i][j]=='*') continue; num[i][j]=dfs(i,j,mark++); int *tt; while(!sb.empty()) { tt=sb.front();sb.pop(); *tt=num[i][j]; } } } for (i=1;i<=n;i++) { for (j=1;j<=m;j++) { if (tm[i][j]=='.') printf("."); else { int tmp=1; int aa[5]; int tmp_ok=0; for (k=0;k<4;k++) { x=i+dx[k]; y=j+dy[k]; if (x>=1&&x<=n&&y>=1&&y<=m) { if (tm[x][y]=='.' ) { int flag=0; for (int h=1;h<=tmp_ok;h++) { if (who[x][y]==aa[h]) flag=1; } if (flag) continue; tmp+=num[x][y]; aa[++tmp_ok]=who[x][y]; } } } printf("%d",tmp%10); } } printf("\n"); } return 0; }
后来写的代码
:#include <cstdio> #include <cmath> #include <cstring> #include <string> #include <algorithm> #include <iostream> #include <queue> #include <map> #include <set> #include <vector> using namespace std; const int N=200005; int id=0; int dx[4]={0,0,1,-1}; int dy[4]={1,-1,0,0,}; char tm[1005][1005]; int col[1005][1005]; int num[1005*1005]; int n,m; int ans[1005][1005]; void dfs(int x,int y,int tmp_id) { if (col[x][y]) return ; if (tmp_id==0) col[x][y]=++id,tmp_id=id; else col[x][y]=tmp_id; num[tmp_id]++; for (int i=0;i<4;i++) { int tx=x+dx[i]; int ty=y+dy[i]; if (!(tx>=1&&tx<=n&&ty>=1&&ty<=m)) continue; if (tm[tx][ty]=='*')continue; dfs(tx,ty,id); } } int main() { int i,j,k,tx,ty; cin>>n>>m; for (i=1;i<=n;i++) { scanf("%s",tm[i]+1); } for (i=1;i<=n;i++) { for (j=1;j<=m;j++) { if (tm[i][j]=='.') dfs(i,j,0); } } set<int >sb; for (i=1;i<=n;i++) { for (j=1;j<=m;j++) { int sum=0; if (tm[i][j]=='.')continue; sb.clear(); for (k=0;k<4;k++) { int tx=i+dx[k]; int ty=j+dy[k]; if (!(tx>=1&&tx<=n&&ty>=1&&ty<=m)) continue; if (tm[tx][ty]=='.'&&sb.find(col[tx][ty])==sb.end()) { sum+=num[col[tx][ty]]; sb.insert(col[tx][ty]); } } ans[i][j]=sum+1; } } for (i=1;i<=n;i++) { for (j=1;j<=m;j++) { if (ans[i][j]) printf("%d",ans[i][j]%10); else printf("."); } printf("\n"); } return 0; }