poj 2965

    xiaoxiao2021-03-25  109

    链接:http://poj.org/problem?id=2965 思路:利用总共的状态只有六万多的特点,我们可以用dfs暴力枚举。不过这里我们换用另一种方法。注意到碰到+号时,将该点的所在行和所在列的每一个点翻转。这样改点翻了七次,该行该列所在点反转了四次,其余是两次。 只有该+点变化了。利用这个性质我们对每一个+进行该操作。再对反转的点进行分析,反转为偶数的就不需要考虑了。剩下的就是答案。(注意到如果是3*3的矩阵这招就不灵了,5*5也是)。

    #include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; int mapp[5][5]; void fuc(int r, int c); int main() { int i,j; char ch; for(i=0; i<4; i++) for(j=0; j<4; j++) { cin>>ch; if(ch == '+') fuc(i,j); } int ans = 0; for(i=0; i<4; i++) for(j=0; j<4; j++) if(mapp[i][j]%2!=0) ans++; cout<<ans<<endl; for(i=0; i<4; i++) for(j=0; j<4; j++) if(mapp[i][j]%2!=0) cout<<i+1<<" "<<j+1<<endl; return 0; } void fuc(int r, int c) { for(int i=0; i<4; i++) { mapp[r][i]++; mapp[i][c]++; } mapp[r][c]--; }
    转载请注明原文地址: https://ju.6miu.com/read-24142.html

    最新回复(0)