小白书之迷宫八连块的递归写法和栈写法

  • Post author:
  • Post category:其他


如果用递归的话,如果图过于大,有栈溢出的危险,所以这里用个栈写法。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<string>
#include<cctype>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<stack>
#define LL __int64
using namespace std;
const int maxn=1001;
int mat[maxn][maxn],vis[maxn][maxn];
int dx[8]={-1,-1,-1,0,0,1,1,1},dy[8]={-1,0,1,-1,1,-1,0,1};
struct point
{
    int x,y;
    point(int x,int y):x(x),y(y) {}
};
void dfs(int x,int y)
{
    /*if(!mat[x][y]||vis[x][y]) return;

    vis[x][y]=1;
    dfs(x-1,y-1);dfs(x-1,y);dfs(x-1,y+1);
    dfs(x,y-1);             dfs(x,y+1);
    dfs(x+1,y-1);dfs(x+1,y);dfs(x+1,y+1);*/
    stack<point> s;
    s.push(point(x,y));
    vis[x][y]=1;
    while(!s.empty())
    {
       point p=s.top();
       s.pop();
       for(int i=0;i<8;i++)
       {
           if(!vis[p.x+dx[i]][p.y+dy[i]]&&mat[p.x+dx[i]][p.y+dy[i]])
           {
               s.push(point(p.x+dx[i],p.y+dy[i]));
               vis[p.x+dx[i]][p.y+dy[i]]=1;
           }
       }

    }
}
int main()
{
    int n;
    while(cin>>n)
    {
        memset(mat,0,sizeof(mat));
        memset(vis,0,sizeof(vis));
      //  for(int i=1;i<=n;i++)
       //     for(int j=1;j<=n;j++)
       //         cin>>mat[i][j];
        for(int i=0;i<n;i++)
        {
            string s;
            cin>>s;
            for(int j=0;j<n;j++)
                mat[i+1][j+1]=s[j]-'0';
        }
        int count=0;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
        {
            if(!vis[i][j]&&mat[i][j])
            {
                count++;
                dfs(i,j);
            }
        }
        cout<<count<<endl;
    }
    return 0;
}



版权声明:本文为ONE_PIECE_HMH原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。