2016年蓝桥杯--剪邮票--涉及数组映射,连通块检测,数组元素全排列

原题链接:

2016-第七届蓝桥杯大赛个人赛省赛(软件类)真题 C大学B组 - Marginalin - 博客园 (cnblogs.com)icon-default.png?t=M1L8https://www.cnblogs.com/Marginalin/p/12609573.html#7.%E5%89%AA%E9%82%AE%E7%A5%A8代码:

#include<iostream>
using namespace std;

int s[13] = {1,1,1,1,1,0,0,0,0,0,0,0}; 
int ans;
int g[3][4];
int dir[4][2] ={ {0,1},{0,-1},{1,0},{-1,0}};

void dfs(int x,int y)
{
	g[x][y] = 0;
	for(int i =0;i<4;i++){
		int nx = x + dir[i][0];
		int ny = y+ dir[i][1];
		if(nx>=0&&nx<3 && ny>=0&&ny<4 && g[nx][ny]==1){
			
			dfs(nx,ny);
		}
	}
}

bool check(){
	int cnt =0; //连通块数量 
	
	for(int i =0;i<3;i++){
		
		for(int j =0;j<4;j++){
			
			if(s[i*3+j]) g[i][j] =1;
		}
	}
	
	for(int i =0;i<3;i++){
		
		for(int j =0;j<4;j++){
			
			if(g[i][j]){
				dfs(i,j);
				cnt++;
			}
		}
	}
	if(cnt==1)
		return true;
	else
		return false;
}

void permutation(int len,int idx)
{
	if(idx==len){
		
		if(check()){ //当前全排列符合要求 
			ans++;
		} 
	}
	for(int i = idx;i<len;i++){
		
		bool flag = true;
		for(int j = i+1;j<len;j++){
			
			if(s[i]==s[j])
				flag = false;
		}
		if(flag){
			swap(s[idx],s[i]);
			permutation(len,idx+1);
			swap(s[idx],s[i]);
		}
	}
 } 

int main()
{
	permutation(12,0);//p[i][j] 全排列的元素个数,当前排列到的下标 
	cout<<ans<<endl;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值