C/C++之四联通问题

给定一个方阵,定义连通性:上下左右相邻,并且值相同。可以想象一张地图,不同的区域被染成了不同的颜色。现在我们需要判断图中任意两点是否在同一个连通区间中。
输入:
整数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;
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值