DFS連通ブロックを求める問題
1546 ワード
四連通ブロック(上、下、左、右)を求めます
8連通のブロック(上、下、左、右、左上、右上、左下、右下)を求めます
#include
#include
#define maxn 105 //
int map[maxn][maxn]; //
int visited[maxn][maxn]; //
int move[8]= {0,1,
1,0,
0,-1,
-1,0
}; //move
int m,n;
void dfs(int r,int c)
{
if(r<0||r>=m||c<0||c>=n)
return;
if(visited[r][c]==1||map[r][c]==0)
return;
visited[r][c]=1;
//
for(int i=0; i<=8; i=i+2)
{
dfs(r+move[i],c+move[i+1]);
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d %d",&m,&n);
int count=0;
memset(map,0,sizeof(map));
memset(visited,0,sizeof(visited));
for(int i=0; i
8連通のブロック(上、下、左、右、左上、右上、左下、右下)を求めます
#include
#include
#define maxn 105 //
int map[maxn][maxn]; //
int visited[maxn][maxn]; //
int m,n;
void dfs(int r,int c)
{
if(r<0||r>=m||c<0||c>=n)
return;
if(visited[r][c]==1||map[r][c]==0)
return;
visited[r][c]=1;
//
for(int dr=-1;dr<=1;dr++)
{
for(int dc=-1;dc<=1;dc++)
{
if(dr!=0||dc!=0)
dfs(r+dr,c+dc);
}
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d %d",&m,&n);
int count=0;
memset(map,0,sizeof(map));
memset(visited,0,sizeof(visited));
for(int i=0; i