HDU2209 ( 翻纸牌游戏 )

思路:枚举然后深搜,时间复杂度有点高。

代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6 int a[25];
 7 char c[25];
 8 int flag;
 9 int len;
10 int judge()
11 {
12    int i,j;
13    int cnt=0;
14    for(i=0;i<len;i++)
15        if (a[i])
16            cnt++;
17     if (!cnt)
18         return 1;
19     return 0;
20 }
21 void change(int i)
22 {
23     a[i]^=1;
24     if (i-1>=0)
25         a[i-1]^=1;
26     if (i+1<len)
27         a[i+1]^=1;
28 }
29 void dfs(int j,int now,int sum)
30 {
31     int i;
32     if (now==sum)
33     {
34         flag=judge();
35         return ;
36     }
37     for(i=j+1;i<len;i++)
38     {
39         change(i);
40         dfs(i,now+1,sum);
41         if (flag)
42             return ;
43         change(i);
44     }
45 }
46 int main()
47 {
48     while(scanf("%s",c)!=EOF)
49     {
50         int i,j;
51         len=strlen(c);
52         int ce=0;
53         memset(a,0,sizeof(a));
54         for(i=0;i<len;i++)
55         {
56             a[i]=c[i]-'0';
57             if (a[i])
58                 ce++;
59         }
60         if (!ce)
61         {
62             printf("0
");
63             continue;
64         }
65         int sum=0;
66         flag=0;
67         for(i=0;i<len;i++)
68         {
69             dfs(-1,0,++sum);
70             if (flag)
71                 break;
72         }
73         if (flag)
74             printf("%d
",sum);
75         else
76             printf("NO
");
77     }
78     return 0;
79 }
View Code
屌丝终有逆袭日,*******。
原文地址:https://www.cnblogs.com/ZhaoPengkinghold/p/3732681.html