POJ 1753 Flip Game (迭代递归)

POJ 1753,题目链接http://poj.org/problem?id=1753

POJ 1753,题目链接http://poj.org/problem?id=1753.

总共有16个点。对某个点选择操作或者不操作。一共有2^16次方种可能。

从前往后枚举,保证不重复。

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<math.h>
 4 #include<algorithm>
 5 #include<vector>
 6 
 7 using namespace std;
 8 int matrix[4][4];
 9 int dx[]={0,1,0,-1};
10 int dy[]={1,0,-1,0};
11 int ans,flag1=0;
12 int ans_min;
13 
14 void dfs(int m,int n)
15 {
16     int find=0;
17     if(flag1)
18         return;
19     for(int i=0;i<4;i++)
20     {
21         for(int j=0;j<4;j++)
22             if(matrix[i][j]!=matrix[0][0])
23             {
24                 find=1;
25                 break;
26             }
27         if(find)
28             break;
29     }
30     if(!find)
31     {
32         flag1=1;
33         return ;
34     }
35     if(ans_min<=ans||m==4)
36         return ;
37     for(int i=m;i<4;i++)
38         for(int j=n;j<4;j++)
39         {
40                 ans++;
41                 matrix[i][j]=!matrix[i][j];
42                 for(int k=0;k<4;k++)
43                 {
44                     if(0<=i+dy[k]&&i+dy[k]<=3&&0<=j+dx[k]&&j+dx[k]<=3)
45                         matrix[i+dy[k]][j+dx[k]]=!matrix[i+dy[k]][j+dx[k]];
46                 }
47 
48                 dfs(i+(j+1)/4,(j+1)%4);
49 
50                 ans--;
51                 matrix[i][j]=!matrix[i][j];
52                 for(int k=0;k<4;k++)
53                 {
54                     if(0<=i+dy[k]&&i+dy[k]<=3&&0<=j+dx[k]&&j+dx[k]<=3)
55                         matrix[i+dy[k]][j+dx[k]]=!matrix[i+dy[k]][j+dx[k]];
56                 }
57         }
58 }
59 
60 int main()
61 {
62     char a;
63     for(int i=0;i<4;i++)
64     {
65         for(int j=0;j<4;j++)
66         {
67             scanf("%c",&a);
68             if(a=='w')
69                 matrix[i][j]=0;
70             else
71                 matrix[i][j]=1;
72         }
73         getchar();
74     }
75 
76     for(ans_min=0;ans_min<=16;ans_min++)
77     {
78         dfs(0,0);
79         if(flag1)
80         {
81             printf("%d\n",ans_min);
82             break;
83         }
84     }
85     if(!flag1)
86         printf("Impossible\n");
87     return 0;
88 }
View Code

 

posted on 2015-05-22 13:33  onlyAzha  阅读(127)  评论(0编辑  收藏  举报

导航