zoukankan      html  css  js  c++  java
  • poj3363

    题意,给定一个01矩阵,要求从0矩阵变换得到该结果,变换的方法是把一个绝对r*c大小的方格内的元素改变(0变1,1变0)。最少多少步。

    分析:我们可以知道如果想改变左上角的方格内的元素,则方法只有一种,即最左上角的r*c是否改变是确定的。在操作完成后,想改变第二行第一列以及第一行第二列的元素,并保持左上角元素不变的方法也分别只有一种。依次类推。可发现整个的方法是确定的。改变后判断结果与要求的结果是否相同即可。

    View Code
    #include <iostream>
    #include
    <cstdio>
    #include
    <cstdlib>
    #include
    <cstring>
    using namespace std;

    #define maxn 105

    int n, m, r, c;
    int map[maxn][maxn], vis[maxn][maxn];

    void change(int x, int y)
    {
    for (int i = x; i < x + r; i++)
    for (int j = y; j < y + c; j++)
    vis[i][j]
    = 1 - vis[i][j];
    }

    bool ok()
    {
    for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++)
    if (map[i][j] != vis[i][j])
    return false;
    return true;
    }

    int main()
    {
    //freopen("t.txt", "r", stdin);
    while (scanf("%d%d%d%d", &n, &m, &r, &c), n | m | r | c)
    {
    getchar();
    for (int i = 0; i < n; i++)
    {
    for (int j = 0; j < m; j++)
    {
    char ch = getchar();
    map[i][j]
    = ch - '0';
    }
    getchar();
    }
    memset(vis,
    0, sizeof(vis));
    int ans = 0;
    for (int i = 0; i < n - r + 1; i++)
    for (int j = 0; j < m - c + 1; j++)
    if (map[i][j] != vis[i][j])
    {
    change(i, j);
    ans
    ++;
    }
    if (ok())
    printf(
    "%d\n", ans);
    else
    printf(
    "-1\n");
    }
    return 0;
    }
  • 相关阅读:
    ios手势复习值之换图片-转场动画(纯代码)
    ios地图小例子和手势的使用 供大家参考一下呦
    basicAnimation移动图形
    一个layer可以跟着画完的线移动ios程序 好玩啊。
    kvo深入浅出举例
    kvc简单实现
    block 浅析
    从相册中取图片
    绘图quartz之渐变
    绘图quartz之加水印
  • 原文地址:https://www.cnblogs.com/rainydays/p/2104858.html
Copyright © 2011-2022 走看看