zoukankan      html  css  js  c++  java
  • 枚举 POJ 1753 Flip Game

    题目地址:http://poj.org/problem?id=1753

      1 /*
      2     这题几乎和POJ 2965一样,DFS函数都不用修改
      3     只要修改一下change规则。。。
      4     注意:是否初始已经ok了要先判断
      5 */
      6 #include <cstdio>
      7 #include <iostream>
      8 #include <algorithm>
      9 #include <cstring>
     10 #include <cmath>
     11 #include <string>
     12 #include <map>
     13 #include <queue>
     14 #include <vector>
     15 using namespace std;
     16 
     17 const int MAXN = 1e6 + 10;
     18 const int INF = 0x3f3f3f3f;
     19 int a[5][5];
     20 bool flag;
     21 
     22 bool ok(void)
     23 {
     24     int tmp = a[1][1];
     25     for (int i=1; i<=4; ++i)
     26     {
     27         for (int j=1; j<=4; ++j)
     28             if (a[i][j] != tmp)    return false;
     29     }
     30 
     31     return true;
     32 }
     33 
     34 void change(int x, int y)
     35 {
     36     a[x][y] = !a[x][y];
     37     if (x > 1)    a[x-1][y] = !a[x-1][y];
     38     if (x < 4)    a[x+1][y] = !a[x+1][y];
     39     if (y > 1)    a[x][y-1] = !a[x][y-1];
     40     if (y < 4)    a[x][y+1] = !a[x][y+1];
     41 }
     42 
     43 void DFS(int x, int y, int num, int cnt)
     44 {
     45     if (num == cnt)
     46     {
     47         flag = ok ();
     48         return ;
     49     }
     50     for (int i=x; i<=4; ++i)
     51     {
     52         int j;
     53         if (i == x)    j = y + 1;
     54         else    j = 1;
     55         for (; j<=4; ++j)
     56         {
     57             change (i, j);
     58             DFS (i, j, num+1, cnt);
     59             if (flag)    return ;
     60             change (i, j);
     61         }
     62     }
     63 }
     64 
     65 void work(void)
     66 {
     67     if (ok ())
     68     {
     69         printf ("%d
    ", 0);        return ;
     70     }
     71     int cnt;
     72     for (cnt=1; cnt<=16; ++cnt)        //最多16次,可以暴力枚举
     73     {
     74         flag = false;
     75         DFS (1, 0, 0, cnt);
     76         if (flag)    break;
     77     }
     78     (cnt <= 16) ? printf ("%d
    ", cnt) : puts ("Impossible");
     79 }
     80 
     81 int main(void)        //POJ 1753 Flip Game
     82 {
     83     //freopen ("A.in", "r", stdin);
     84 
     85     char ch;
     86     for (int i=1; i<=4; ++i)
     87     {
     88         for (int j=1; j<=4; ++j)        //b-0 w-1
     89         {
     90             scanf ("%c", &ch);
     91             a[i][j] = (ch == 'b') ? 0 : 1;
     92         }
     93         getchar ();
     94     }
     95 
     96     work ();
     97 
     98     return 0;
     99 }
    100 
    101 /*
    102 Impossible
    103 */
    编译人生,运行世界!
  • 相关阅读:
    jmap、jhat、jstat、jstack
    jconsole、java VisualVM、jprofiler
    最长递增子序列 dp
    我的眼泪流下来
    理解二级指针的好例子
    离散数学复习————二元关系
    linux的常用命令
    初学Java
    分治法 ----归并排序
    1074 Reversing Linked List
  • 原文地址:https://www.cnblogs.com/Running-Time/p/4372140.html
Copyright © 2011-2022 走看看