

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int g[3][4];
int a[]={0,0,0,0,0,0,0,1,1,1,1,1}; ///每个排列代表着12选5的一个方案
int ans=0;
///枚举所有5张牌的组合,检查他们是不是一个连通块
void dfs(int i,int j)
{
g[i][j]=0;
if(g[i+1][j]==1&&i+1<=2) dfs(i+1,j);
if(g[i-1][j]==1&&i-1>=0) dfs(i-1,j);
if(g[i][j+1]==1&&j+1<=3) dfs(i,j+1);
if(g[i][j-1]==1&&j-1>=0) dfs(i,j-1);
}
bool check()
{
for(int i=0;i<3;i++)
{
for(int j=0;j<4;j++)
{
if(a[i*4+j]==1) ///将一维数组映射到二维矩阵中
{
g[i][j]=1;
}
else g[i][j]=0;
}
}
int cnt=0; ///连通块的数目
for(int i=0;i<3;i++) ///g上就有5个格子被标记为1,现在才用dfs做连通性检查,要求只有一个连通块
{
for(int j=0;j<4;j++)
{
if(g[i][j]==1)
{
dfs(i,j);
cnt++;
}
}
}
if(cnt==1)
{
return 1;
}
else return 0;
}
int main()
{
ans=0;
do
{
if(check())
{
ans++;
}
}while(next_permutation(a,a+12));
printf("%d\n",ans);
}
本文介绍了一个使用 C++ 实现的算法,该算法通过深度优先搜索(DFS)来判断一组指定的二维网格上的点是否构成一个连通块。文章详细展示了如何通过递归地探索相邻单元格来实现连通性的检查,并统计符合条件的连通块数量。
2328

被折叠的 条评论
为什么被折叠?



