图1(八连块)

Posted O了吗

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图1(八连块)相关的知识,希望对你有一定的参考价值。

输入一个m行n列的字符矩阵,统计字符“@”组成多少个八连块。如果两个字符“@”所在的格子相邻(横、竖或者对角线方向),就说它们属于同一个八连块。

 

Sample Input

 

1 1 

3 5 
*@*@* 
**@** 
*@*@* 
1 8 
@@****@* 
5 5 
****@ 
*@@*@ 
*@**@ 
@@@*@ 
@@**@ 
0 0

Sample Output




2

 

#include"iostream"
using namespace std;
char **map;    
int w,h;
bool selected(int &y,int &x,int n){
    int i[8] = {-1,0,1,1,1,0,-1,-1};
    int j[8] = {-1,-1,-1,0,1,1,1,0};
    if(i[n] + y >= 0 && i[n] + y < h && j[n] + x >= 0 && j[n] + x < w && map[i[n] + y][j[n] + x] == @){
        y += i[n];
        x += j[n];
        return true;
    }
    return false;
}
void find8(int y,int x){
    if(map[y][x] == @){
        map[y][x] = *;
        int x1 = x,y1 = y;
        for(int i = 0;i < 8;i++){
            if(selected(y,x,i)){
                find8(y,x);
            }
            x = x1;
            y = y1;
        }
    }
}
void create(){
    map = new char*[h];
    for(int i = 0;i < h;i++){
        map[i] = new char[w];
        for(int j = 0;j < w;j++){
            cin>>map[i][j];
        }
    }
}

int main(){
    while(cin>>w>>h && w && h){
        int a = 2,b = 2;
        int count = 0;
        create();
        for(int i = 0;i < h;i++){
            for(int j = 0;j < w;j++){
                if(map[i][j] == @){
                    find8(i,j);
                    count++;
                }
            }
        }
        cout<<count<<endl;
        for(i = 0;i < h;i++){
            delete[] map[i];
        }
    }
    return 0;
}

 

以上是关于图1(八连块)的主要内容,如果未能解决你的问题,请参考以下文章

用DFS求连通块(种子填充)

数据结构基础_图

八连块问题

统计八连块

20612统计八连块

小白书 黑白图像DFS/Flood Fill