题意:
给出3*4的一张邮票,你需要从上面剪五张,要求这五张是连续的,问有多少种方法。
思路:
我看了网上的dalao们的代码,清一色的dfs解决。然饿我连代码都看不懂,所以只好写个不需要dfs就能解决的代码了。
首先
a[]表示十二张邮票,0表示未被剪,1表示被剪掉了.
b[]表示被剪掉的位置
c[]表示哪些位置被剪掉可以保证是连续的
首先将b中第一个位置标记为可减掉,并将周围的满足条件的位置标记为可减掉,然后将b中被标记为可剪掉的位置也标记并不断扩大。
然后我们进行4次循环(因为此时b中最多还有四个数没有判断出来),每次都将满足被标记的位置的b中元素标记并将周围标记。最后判断一下b中元素是否都被标记了。
代码:
#include <cstdio>
#include <cstring>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <cmath>
#include <algorithm>
#include<bits/stdc++.h>
using namespace std;
const double N = 1e6+10;
const double pi = acos(-1.0);
const int INF = 0x3f3f3f3f;
const int MOD = 1000000007;
const inline int read(){
int k = 0, f = 1; char c = getchar();
for(;!isdigit(c); c = getchar())
if(c == '-') f = -1;
for(;isdigit(c); c = getchar())
k = k * 10 + c - '0';
return k * f;
}
#define ll long long
#define CL(a,b) memset(a,b,sizeof(a))
#define MAXN 100010
int a[MAXN];
int b[MAXN];
int c[50] = {0};
int d[50] = {0};
int e[50] = {0};
int main()
{
int ans = 0;
int a[12]={0,0,0,0,0,0,0,1,1,1,1,1};
do{
int l = 0;
memset(c,0,sizeof(c));//
memset(e,0,sizeof(e));//
for(int i = 0 ; i < 12 ; i++)
{
if(a[i] == 1)
{
b[l] = i;
l++;
}
}
if(b[0]==0)
{
c[1]=1;
c[4]=1;
}
if(b[0]==1)
{
c[0]=1;
c[2]=1;
c[5]=1;
}
if(b[0]==2)
{
c[1]=1;
c[3]=1;
c[6]=1;
}
if(b[0]==3)
{
c[2]=1;
c[7]=1;
}
if(b[0]==4)
{
c[0]=1;
c[5]=1;
c[8]=1;
}
if(b[0]==5)
{
c[1]=1;
c[4]=1;
c[6]=1;
c[9]=1;
}
if(b[0]==6)
{
c[2]=1;
c[5]=1;
c[7]=1;
c[10]=1;
}
if(b[0]==7)
{
c[3]=1;
c[6]=1;
c[11]=1;
}
if(b[0]==8)
{
c[9]=1;
c[4]=1;
}
if(b[0]==9)
{
c[5]=1;
c[8]=1;
c[10]=1;
}
if(b[0]==10)
{
c[6]=1;
c[9]=1;
c[11]=1;
}
if(b[0]==11)
{
c[7]=1;
c[10]=1;
}
int flag = 0;
int l2 = 0;
l2++;
e[b[0]] = 1;
c[b[0]] = 1;
for(int i = 1 ; i < l ; i++)
{
if(e[b[i]]==0&&c[b[i]]==1)
{
e[b[i]]=1;
if(b[i]==0)
{
c[1]=1;
c[4]=1;
}
if(b[i]==1)
{
c[0]=1;
c[2]=1;
c[5]=1;
}
if(b[i]==2)
{
c[1]=1;
c[3]=1;
c[6]=1;
}
if(b[i]==3)
{
c[2]=1;
c[7]=1;
}
if(b[i]==4)
{
c[0]=1;
c[5]=1;
c[8]=1;
}
if(b[i]==5)
{
c[1]=1;
c[4]=1;
c[6]=1;
c[9]=1;
}
if(b[i]==6)
{
c[2]=1;
c[5]=1;
c[7]=1;
c[10]=1;
}
if(b[i]==7)
{
c[3]=1;
c[6]=1;
c[11]=1;
}
if(b[i]==8)
{
c[9]=1;
c[4]=1;
}
if(b[i]==9)
{
c[5]=1;
c[8]=1;
c[10]=1;
}
if(b[i]==10)
{
c[6]=1;
c[9]=1;
c[11]=1;
}
if(b[i]==11)
{
c[7]=1;
c[10]=1;
}
}
}
int m = 4;
while(m--)
{
for(int i = 1 ; i < l ; i++)
{
if(e[b[i]]==1)
{
continue;
}
else
{
if(c[b[i]]==1)
{
e[b[i]] = 1;
if(b[i]==0)
{
c[1]=1;
c[4]=1;
}
if(b[i]==1)
{
c[0]=1;
c[2]=1;
c[5]=1;
}
if(b[i]==2)
{
c[1]=1;
c[3]=1;
c[6]=1;
}
if(b[i]==3)
{
c[2]=1;
c[7]=1;
}
if(b[i]==4)
{
c[0]=1;
c[5]=1;
c[8]=1;
}
if(b[i]==5)
{
c[1]=1;
c[4]=1;
c[6]=1;
c[9]=1;
}
if(b[i]==6)
{
c[2]=1;
c[5]=1;
c[7]=1;
c[10]=1;
}
if(b[i]==7)
{
c[3]=1;
c[6]=1;
c[11]=1;
}
if(b[i]==8)
{
c[9]=1;
c[4]=1;
}
if(b[i]==9)
{
c[5]=1;
c[8]=1;
c[10]=1;
}
if(b[i]==10)
{
c[6]=1;
c[9]=1;
c[11]=1;
}
if(b[i]==11)
{
c[7]=1;
c[10]=1;
}
}
}
}
}
for(int i = 0 ; i < l ; i++)
{
if(c[b[i]]==1)
{
continue;
}
else
{
flag = 1;
break;
}
}
if(flag == 0)
{
ans++;
}
}while(next_permutation(a,a+12));
cout << ans << endl;
return 0;
}