请你计算,一共有多少种不同的剪取方法。
思路分析
全排列加连通块判断。初始化一个3*4的二维数组,然后任选五个位置(保证后面不重复),最后判断这五个位置是否连通即可。
具体实现
代码:
#include
using namespace std; int dir[4][2]={
{
0,1},{
0,-1},{
1,0},{
-1,0}}; bool vis[3][4]={
false}; int b[15],res; int maze[3][4]; bool in(int x,int y) {
//判断是否越界 return x>=0&&x<3&&y>=0&&y<4; } //判断连通性 void dfs(int x,int y) {
vis[x][y]=true; for(int i=0;i<4;i++) {
int dx=x+dir[i][0]; int dy=y+dir[i][1]; if(in(dx,dy)&&!vis[dx][dy]&&maze[dx][dy]==1) {
//找到下一个1就继续dfs dfs(dx,dy); } } } int main() {
int b[]={
0,0,0,0,0,0,0,1,1,1,1,1}; //12选5 do {
memset(maze,0,sizeof(maze)); memset(vis,false,sizeof(vis)); for(int i=0;i<3;i++) {
for(int j=0;j<4;j++) {
//选择了5个数为1 if(b[i*4+j]==1) {
maze[i][j]=1; } } } int ans=0; for(int i=0;i<3;i++) {
for(int j=0;j<4;j++) {
if(maze[i][j]==1&&!vis[i][j]) {
//计算连通块个数 ans++; dfs(i,j); } } } if(ans==1) {
//只有一个连通块,满足条件 res++; } }while(next_permutation(b,b+12)); cout<<res; return 0; }
最终答案:116
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/176120.html原文链接:https://javaforall.net
