黑白图像(DFS)

题面
黑白图像
输入一个n×n的黑白图像(1表示黑色,0表示白色),任务是统计其中八连块的个数。如果两个黑格子有公共边或者公共顶点,就说它们属于同一个八连块。如下图所示的图形有3个八连块。
100100
001010
000000
110000
111000
010100

输入
第一行输入一个n 表示图的大小
接下来n行 用来表示图的组成
输出
输出八连块的个数
样例.in
6
1 0 0 1 0 0
0 0 1 0 1 0
0 0 0 0 0 0
1 1 0 0 0 0
1 1 1 0 0 0
0 1 0 1 0 0
样例.out
3

题目分析
这一题能很清楚的看出来是一道DFS题目,代码也很好去实现,
具体的应该就是:碰到黑色的方块就开始搜索向多个方向找,但在其中,要防止重复找与越界

大体框架

void search(int x,int y)
{
    if (走出去了 || 走过了 ||碰到白色方块了) return;  //边界
        else //否则,继续找
            {
                打占位符;
                向8个方向开始找;
            }
}


int main()
{
.......
    在外圈打一层越界标识
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= n; j++) 
                {
                    if (是黑色的方块 && 没找过)
                        {
                            计数器+1;
                            从目前位置开始找;
                        }
                }

代码

#include <bits/stdc++.h>
using namespace std;

int dx[9]={0,0,0,-1,1,-1,-1,1,1};  //8个方向的介值
int dy[9]={0,1,-1,0,0,-1,1,1,-1};  
int a[200][200],n,ans,vis[200][200];  //a是map数组,vis数组数用来记录某些元素是否找过

void search(int x,int y)  
{
    if (a[x][y] == 2 || vis[x][y] == 1 || a[x][y] == 0) return;  //边界——走出去了,走过了,碰到白色方块了
        else
            {
                vis[x][y]=1; //打标记
                for (int i = 1; i <= 8; i++)  //8个方向开搜
                    search(x+dx[i],y+dy[i]);
            //  vis[x][y]=0;
            }
}

int main()
{
    cin>>n;  //输入

        for (int i = 0; i <= n+1; i++)
            for (int j = 0; j <= n+1; j++)
                a[i][j]=2;   //先是多一圈全部打上越界标记,以为之后在读入时,内部的自然会被覆盖

        for (int i = 1; i <= n; i++)  
            for (int j = 1; j <= n; j++)
                cin>>a[i][j];

        //for (int i = 0; i <= n+1; i++)
    //  {
    //      for (int j = 0; j <= n+1; j++)
    //          cout<<a[i][j]<<' ';
    //      cout<<endl;
    //  }   

        for (int i = 1; i <= n; i++)  //开始,两重循环,整个图都搜一遍
            for (int j = 1; j <= n; j++) 
                {
                    if (a[i][j] == 1 && vis[i][j] == 0)  //如果是黑色方块并且没有搜过(PS这样的判断能有效的剪枝)
                        {
                            ans++;   //无论如何,ans++,因为一个方块也算
                            search(i,j);  //从当前位置开始找
                        }
                }

        cout<<ans;   //输出
    return 0;  //完美的结束程序
}
                                                         **蒟蒻新星c_uizrp_dzjopkl原创**

猜你喜欢

转载自blog.csdn.net/c_uizrp_dzjopkl/article/details/81749290