看这道题之前,我们先来学习一下什么是c++中的全排列函数,next_permutation,可以粘贴这段代码看一下,运行结果,会发现会出现指定序列的全排列
#include<bits/stdc++.h>
using namespace std;
int main(){
int a[4]={2,1,3,4};
sort(a,a+4);
do{
for(int i=0;i<4;i++){
printf("%d ",a[i]);
}
printf("\n");
}while(next_permutation(a,a+4));
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int main(){
string str;
cin>>str;
sort(str.begin(),str.end());
do{
cout<<str<<endl;
}while(next_permutation(str.begin(),str.end()));
return 0;
}
本题的解题思路是:全排列+连通性检查,因为dfs有一个不能够遍历到T型形状的弊端,所以不能用dfs,下图即为T字形
#include<bits/stdc++.h>
using namespace std;
int a[12]={0,0,0,0,0,0,0,1,1,1,1,1};
int g[3][4];
int dfs(int i,int j){
//令所有可以联通的块都置0
g[i][j]=0;
if(i+1<3&&g[i+1][j]==1) dfs(i+1,j);
if(i-1>=0&&g[i-1][j]==1) dfs(i-1,j);
if(j+1<4&&g[i][j+1]==1) dfs(i,j+1);
if(j-1>=0&&g[i][j-1]==1) dfs(i,j-1);
}
int f(){
//生成a对应的二维数组
for(int i=0;i<3;i++){
for(int j=0;j<4;j++){
g[i][j]=a[i*4+j];
}
}
//连通性检测,如果联通块的数量为1,则是一种正确的方案
int cnt=0;
for(int i=0;i<3;i++){
for(int j=0;j<4;j++){
if(g[i][j]==1){
dfs(i,j);
cnt++;
}
}
}
return cnt==1;
}
int main(){
int ans=0;
do{
if(f()==1){
ans++;
}
}while(next_permutation(a,a+12));
printf("%d\n",ans);
}