|
沙发
楼主 |
发表于 2019-10-27 17:49:34
|
只看该作者
典型的种子填充算法,直观的用两个二维数组,一个a表示当前的棋盘,一个v表示是否被访问过,然后每行每列逐个扫描填充。
- #include<iostream>
- using namespace std;
- const int mm=110;
- int m,n,x;
- char ch;
- int a[mm][mm]; ///原始棋盘
- int v[mm][mm]; ///是否被访问
- int dr[]= {0,+1,+0,-1,+0};
- int dc[]= {0,+0,+1,+0,-1}; ///下右上左
- void check() ///检查a数组和v数组
- {
- for (int r=1; r<=m; r++,cout<<endl)
- for (int c=1; c<=n; c++) cout<<a[r][c];
- for (int r=1; r<=m; r++,cout<<endl)
- for (int c=1; c<=n; c++) cout<<v[r][c];
- }
- void bfs(int r ,int c,int x) ///从rc处开始给区域染色为x
- {
- ///cout<<r<<' '<<c<<' '<<x<<endl;
- int qr[mm*mm],qc[mm*mm]; ///队列,注意空间大小
- int h=1,t=2;
- qr[h]=r,qc[h]=c,v[r][c]=x;///队头染色
- while (h<t)
- {
- for (int i=1; i<=4; i++)
- {
- int tr=qr[h]+dr[i],tc=qc[h]+dc[i];
- if (a[tr][tc]!=0 && v[tr][tc]==0)
- {
- v[tr][tc]=x;
- qr[t]=tr,qc[t]=tc,t++;
- }
- }
- h++;
- }
- }
- int main()
- {
- cin>>m>>n;
- for (int r=1; r<=m; r++)
- for (int c=1; c<=n; c++)
- {
- cin>>ch;
- a[r][c]=ch-'0';
- }
- for (int r=1; r<=m; r++)
- for (int c=1; c<=n; c++)
- if (a[r][c]!=0 && v[r][c]==0) bfs(r,c,++x);
- ///check();
- cout<<x;
- return 0;
- }
- /*
- 4 10
- 0234500067
- 1034560500
- 2045600671
- 0000000089
- */
复制代码 |
|