zoukankan      html  css  js  c++  java
  • poj 2965 The Pilots Brothers' refrigerator

    题目描述:

      有一个4*4的矩阵,求最少次的操作,把这16个格子都变成‘-’,每次翻转(i,j)的时候,第i行,第j列也会变为相反的状态。

    解题思路:

      话说条条大路通罗马,这个题目也有很多种方法,1:bfs+状态压缩,2:状态压缩+枚举,3:高斯消元。这些方法都可以,我在这里就说一下我的方法。

      根据每次操作的变化可以知道,对于一个矩阵,如果只有(i,j)是‘+’状态,我们把第i行,第j列的格子都操作一次全部都会变为合法状态(‘-’的,成为合法状态),我们现在对所有的不合法状态都进行此操作,我们会发现有一些格子我们操作了两次或者是偶数次,因为每个格子只有两种状态,为了使操作有意义,我们对每个格子最多操作一次,最后我们只需要统计操作奇数次的格子并输出其对应的下标即可。

    题目链接:

      http://poj.org/problem?id=2965

    代码:

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <cstdlib>
     4 
     5 #define N 5
     6 
     7 char map[N];
     8 int vis[N][N];
     9 void change (int x, int y);
    10 void add ();
    11 
    12 int main ()
    13 {
    14     int i, j, sum, n;
    15     memset (vis, 0, sizeof(vis));
    16 
    17     for (i=0; i<4; i++)
    18     {
    19         scanf ("%s", map);
    20         for (j=0; j<4; j++)
    21             if (map[j] == '+')
    22                 change (i, j);
    23     }
    24 
    25     add ();
    26     return 0;
    27 }
    28 
    29 void change (int x, int y)
    30 {
    31     for (int i=0; i<4; i++)
    32        vis[x][i]++, vis[i][y]++;
    33 
    34         vis[x][y] --;
    35 }
    36 void add ()
    37 {
    38     int i, j, num = 0;
    39 
    40     for (i=0; i<4; i++)
    41         for (j=0; j<4; j++)
    42             if (vis[i][j] % 2)
    43                 num ++;
    44     printf ("%d
    ", num);
    45     for (i=0; i<4; i++)
    46         for (j=0; j<4; j++)
    47         if (vis[i][j] % 2)
    48         printf ("%d %d
    ", i+1, j+1);
    49 }
    View Code
    本文为博主原创文章,未经博主允许不得转载。
  • 相关阅读:
    date format记录
    python同时遍历两个list
    Windbg分析DMP文件
    DNS原理及其解析过程(转)
    有关正则表达式的详细内容
    sizeof _countof _tcslen的比较
    关于androidX
    UML类图
    springBoot 访问html页面遇到的坑
    hashmap 的实现原理
  • 原文地址:https://www.cnblogs.com/alihenaixiao/p/4164177.html
Copyright © 2011-2022 走看看