HDU 4146 Filp Game

版权声明:欢迎提问:3079238667@qq.com https://blog.csdn.net/include_heqile/article/details/79968131

http://acm.hdu.edu.cn/showproblem.php?pid=4146
题目意思很简单,就是给你一个N*N的正方形,里面有N*N个格子,每个格子里面有一张纸片,这张纸片共有两面,White和Black,然后让你求出某一行或者某一列的纸片被翻转后,最终还有多少张纸片是白面朝上

我们要是直接暴力遍历的话,肯定会超时的
1 <= N <= 1000, 0 <= Q <= 100000
看这个数据范围,就是限制你不让你用暴力求解

其实解决方法也很简单,我们只需把为每行和每列的0索引值空出来,用来记录该行或者该列是否被翻转了即可
具体代码如下:

#include<stdio.h>
#include<string.h>

int wnum[1001][1001];
char square[1001][1001];
int main() {
    int T;
    scanf("%d", &T);
    int kase = 0;
    while(T--) { 
        int N;
        scanf("%d", &N);
        memset(square, '\0', sizeof(square));
        memset(wnum, 0, sizeof(wnum));
        for(int i = 1; i <= N; i++)
            scanf("%s", square[i]); 
        for(int i = 1; i <= N; i++)  
            for(int j = 1; j <= N; j++) 
                if(square[i][j-1] == 'w')  
                    wnum[i][j] = 1; 
        int n, a, b;
        scanf("%d", &n);
        for(int i = 0; i < n; i++) {
            scanf("%d%d", &a, &b);
            wnum[a][0] = !wnum[a][0];
            wnum[0][b] = !wnum[0][b];
        }
        for(int i = 1; i <= N; i++) {
            if(wnum[i][0])
                for(int j = 1; j <= N; j++)
                    wnum[i][j] = !wnum[i][j]; 
            if(wnum[0][i])
                for(int j = 1; j <= N; j++)
                    wnum[j][i] = !wnum[j][i]; 
        }
        int sum = 0;
        for(int i = 1; i <= N; i++) 
            for(int j = 1; j <= N; j++)  
                if(wnum[i][j])
                    sum++; 
        printf("Case #%d: %d\n", ++kase, sum);
    }
    return 0;
}
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页