给定一个方阵,定义连通性:上下左右相邻,并且值相同。可以想象一张地图,不同的区域被染成了不同的颜色。现在我们需要判断图中任意两点是否在同一个连通区间中。
输入:
整数N(N<50),代表矩阵的行列数
输入N行,每行N个字符,代表矩阵中的元素
输入一个整数M(M<1000)表示询问次数
输入M行每行代表一个询问,格式为4个整数x1 y1 x2 y2,代表需要检测的点
输出:
true或false
输入
10
0 0 1 0 0 0 0 0 0 0
0 0 1 1 1 0 0 0 0 0
0 0 0 0 1 1 1 1 1 0
0 0 0 1 1 0 0 0 1 0
1 1 1 1 0 1 0 0 1 0
0 0 0 0 0 1 0 0 1 0
0 0 0 0 0 1 0 0 1 1
0 1 1 1 1 1 1 0 0 0
0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0
3
0 0 9 9
0 2 6 8
4 4 4 6
输出
0
1
1
#include<iostream>
using namespace std;
int graph[100][100];
int query[1000][4];
int n,m;
bool check(int label[100][100],int point[4])
{
int x1=point[0];
int y1=point[1];
int x2=point[2];
int y2=point[3];
if(x1==x2&&y1==y2)
return true;
bool f1=false;
bool f2=false;
bool f3=false;
bool f4=false;
int value=graph[x1][y1];
if(x1-1>=0&&label[x1-1][y1]==0&&graph[x1-1][y1]==value)
{
point[0]=x1-1;
label[x1-1][y1]=1;
f1=check(label,point);
point[0]=x1;
label[x1-1][y1]=0;
}
if(x1+1<n&&label[x1+1][y1]==0&&graph[x1+1][y1]==value)
{
point[0]=x1+1;
label[x1+1][y1]=1;
f2=check(label,point);
point[0]=x1;
label[x1+1][y1]=0;
}
if(y1-1>=0&&label[x1][y1-1]==0&&graph[x1][y1-1]==value)
{
point[1]=y1-1;
label[x1][y1-1]=1;
f3=check(label,point);
point[1]=y1;
label[x1][y1-1]=0;
}
if(y1+1<n&&label[x1][y1+1]==0&&graph[x1][y1+1]==value)
{
point[1]=y1+1;
label[x1][y1+1]=1;
f4=check(label,point);
point[1]=y1;
label[x1][y1+1]=0;
}
return f1||f2||f3||f4;
}
int main()
{
int label[100][100];
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>graph[i][j];
cin>>m;
for(int i=0;i<m;i++)
cin>>query[i][0]>>query[i][1]>>query[i][2]>>query[i][3];
for(int i=0;i<m;i++)
cout<<check(label,query[i])<<endl;
}
连通区域的个数(0有多少个连通区域+1有多少个连通区域)
输入
10
0 0 1 0 0 0 0 0 0 0
0 0 1 1 1 0 0 0 0 0
0 0 0 0 1 1 1 1 1 0
0 0 0 1 1 0 0 0 1 0
1 1 1 1 0 1 0 0 1 0
0 0 0 0 0 1 0 0 1 0
0 0 0 0 0 1 0 0 1 1
0 1 1 1 1 1 1 0 0 0
0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0
输出
5
#include<iostream>
using namespace std;
int graph[100][100];
int n,count;
void check(int x1,int y1,int value)
{
if(x1<0||y1>=n)
return;
if(x1-1>=0&&graph[x1-1][y1]==value)
{
graph[x1-1][y1]=-1;
check(x1-1,y1,value);
}
if(y1-1>=0&&graph[x1][y1-1]==value)
{
graph[x1][y1-1]=-1;
check(x1,y1-1,value);
}
if(x1+1<n&&graph[x1+1][y1]==value)
{
graph[x1+1][y1]=-1;
check(x1+1,y1,value);
}
if(y1+1<n&&graph[x1][y1+1]==value)
{
graph[x1][y1+1]=-1;
check(x1,y1+1,value);
}
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>graph[i][j];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(graph[i][j]!=-1)
{
check(i,j,graph[i][j]);
graph[i][j]=-1;
count++;
}
}
cout<<count;
}