• POJ2965(The Pilots Brothers' refrigerator)


    题目大意:一个冰箱上面有16个按钮,“+”代表按钮为关,“-”代表按钮为开。 当16个按钮都为开的时候冰箱才能打开。

    游戏规则:你可以改变矩阵里任意位置(i,j)的状态,但是第i行和第j列的所有状态都须改变。然后问你最少需要改变多少次状态可以打开冰箱。

    解题思路: 枚举+DFS(类似于poj1753)

         类似于poj1753,枚举16种可能性(可能只需改变一个按钮都可以使所有按钮都打开、可能只需改变两个按钮都可以使所有按钮都打开,可能只需改变三个按钮都可以使所有按钮都打开.......可能只需改变十六个按钮都可以使所有按钮都打开)  。然后深搜每一种可能性,找到每一种可能性按钮的所有状态,看是否能打开冰箱。

       还有一点需要输出 最小步数 改变的按钮位置。这时可以定义一个b[4][4],初始化为0,改变的时候赋值为1。最后输出b为1的位置即可。

    代码:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<algorithm>
     5 using namespace std;
     6 int a[4][4];
     7 int b[4][4];
     8 int flag;
     9 int judge()
    10 {
    11     int cnt=0;
    12     int i,j;
    13     for(i=0;i<4;i++)
    14        for(j=0;j<4;j++)
    15            if (a[i][j])
    16                cnt++;
    17     if (cnt==16)
    18         return 1;
    19     return 0;
    20 }
    21 void change(int i,int j)
    22 {
    23     int k;
    24     a[i][j]^=1;
    25     for(k=0;k<4;k++)
    26         a[i][k]^=1;
    27     for(k=0;k<4;k++)
    28         a[k][j]^=1;
    29 }
    30 void dfs(int j,int now,int sum)
    31 {
    32     int i;
    33     if (now==sum)
    34     {
    35         flag=judge();
    36         return ;
    37     }
    38     for(i=j+1;i<16;i++)
    39     {
    40         change(i/4,i%4);
    41         b[i/4][i%4]=1;
    42         dfs(i,now+1,sum);
    43         if (flag)
    44            return ;
    45         change(i/4,i%4);
    46         b[i/4][i%4]=0;
    47     }
    48 }
    49 int main()
    50 {
    51     int i,j;
    52     char c;
    53     memset(a,0,sizeof(a));
    54     memset(b,0,sizeof(b));
    55     for(i=0;i<4;i++)
    56     {
    57        for(j=0;j<4;j++)
    58        {
    59            scanf("%c",&c);
    60            if(c=='+')
    61                a[i][j]=0;
    62             else
    63                 a[i][j]=1;
    64        }
    65        getchar();
    66     }
    67     int sum=0;
    68     flag=0;
    69     for(i=0;i<16;i++)
    70     {
    71         dfs(-1,0,++sum);
    72         if (flag)
    73             break;
    74     }
    75     printf("%d
    ",sum);
    76     for(i=0;i<4;i++)
    77         for(j=0;j<4;j++)
    78         {
    79             if (b[i][j])
    80                 printf("%d %d
    ",i+1,j+1);
    81         }
    82     return 0;
    83 }
    View Code
    屌丝终有逆袭日,*******。
  • 相关阅读:
    vue 实例化定义路由模板
    MUI区域滚动,软键盘挡住input
    javaScript使用navigator.userAgent.toLowerCase()判断移动端类型
    vue-cli启动本地服务,局域网下通过ip访问不到的原因
    vue 实例化定义路由
    如何在同一个Excel里,对两个很相似的工作簿比对出不同之处
    常见贴片电容电阻封装及功率
    集成运放输入电压范围指标参数Uicmax,Uidmax
    复合管等效管
    urlparse模块
  • 原文地址:https://www.cnblogs.com/ZhaoPengkinghold/p/3732570.html
Copyright © 2020-2023  润新知