考点:

利用next_permutation+映射 求n个元素的集合中选m个组合

//数组的个数是集合中元素的个数,1的个数为选出元素的个数
vector<int>a({0,0,...,1,1,...1});

void f(vector<int>a)
{
  for(int i=0;i<a.size();i++)
  {
    if(a==1)
    {
      //选F(i)
    }
  }
 
}

do
{
    f(a);//a通过f映射为集合元素的组合

}while(a.begin(),a.end());
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.

dfs二维数组的连通性检查(dfs求网格连通分支个数)

grid[row][col]
void dfs(int x,int y)
{
  if(!(x>=0&&y>=0&&x<row&&y<col))return;
  if(x+1<row&&grid[x+1][y]==1)dfs(x+1,y);
  if(y+1<col&&grid[x][y+1]==1)dfs(x,y+1);
  if(x-1>=0&&grid[x-1][y]==1)dfs(x-1,y);
  if(y-1>=0&&grid[x][y-1]==1)dfs(x,y-1); 
}
bool is_connect()
{
  int cnt=0;
  for(int i=0;i<row;i++)
  {
    for(int j=0;i<col;j++)
    {
      if(grid[i][j]==1)
      {
         grid[i][j]=0;//“陆地下沉”
         dfs(i,j);
         cnt++;
      }
    }
  }
  return cnt==1;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.

蓝桥2017真题剪邮票_蓝桥杯

思路:生成所有1~12中的5个数组合,判断这5个数对应的格子是否连通

答案:116

#include<bits/stdc++.h>
using namespace std;
vector<int>a({0,0,0,0,0,0,0,1,1,1,1,1});//它的每个排列代表着12选5 的一个方案  
int grid[3][4];
int cnt=0;
void dfs(int x,int y)
{
	if(!(x>=0&&y>=0&&x<3&&y<4))return;//越界返回
	grid[x][y]=0;
	if(x+1<3&&grid[x+1][y]==1)dfs(x+1,y);
	if(y+1<4&&grid[x][y+1]==1)dfs(x,y+1);
	if(x-1>=0&&grid[x-1][y]==1)dfs(x-1,y);
	if(y-1>=0&&grid[x][y-1]==1)dfs(x,y-1); 
} 
bool is_connect()
{ 
 int cnt=0;
 for(int i=0;i<3;i++)
 {
 	for(int j=0;j<4;j++)
 	{
 	  
	   if(grid[i][j]==1)
	   {
	     dfs(i,j);
		 cnt++;	
	   }	
	}
 }
 return cnt==1;	
}
void f(vector<int>a)
{
   for(int i=0;i<a.size();i++)
   {
   	if(a[i]==1)
   	{
   		grid[i/4][i%4]=1;
	}
   }	
} 
int main()
{

	do
	{
		memset(grid,0,12);
		f(a);//将全排列映射到grid中
		
		if(is_connect())
		{
		  cnt++;	
		} 		
     }while(next_permutation(a.begin(),a.end()));//next_permutation保证全排列不重复不重复 
    cout<<cnt;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.

做题记录:

第一次做:答案出错 原因:a数组少写个0

第二次做:结果正确