zoukankan      html  css  js  c++  java
  • [kuangbin带你飞]专题一 简单搜索

    POJ 3279 (暴力搜索)

    首先根据题目,每次操作都会影响到周围的“棋子”,而要使得每个1都被反转为0,那么我们就应当每次都反转1下方的棋子以改变1为0.

    那么,当我们处理过1到n-1行的时候,前n-1行就都已经是0了,最后我们只需要检查最后一行是不是全部为0就可以检查这次的出操作是否正确了。如果正确且最小,那就存起来。最后输出,万事大吉。

    当然,因为我们要改变第x行的1为0需要反转的是x+1行的位置。而这个整个规则是我们验证一组操作是否能达到目的所用的,那么我们需要在验证前先确定操作(没操作怎么验证..)。

    于是根据规则内容可知,只需要能确认第一行的翻转情况,就能够推出下面所有的翻转情况并验证是否正确。于是需要做的就是枚举第一行的情况了。

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <cstdlib>
    using namespace std;
    typedef long long ll;
    const int INF = 0x3f3f3f3f;
    const int N = 17;
    const int dx[] = {-1, 0, 1, 0, 0};
    const int dy[] = { 0,-1, 0, 1, 0};
    
    int grid[N][N], state[N][N], tmp[N][N], rec[N][N];
    
    int n, m, ans;
    void flip(int x, int y) {
        tmp[x][y] = 1;
        int nx, ny;
        for(int i = 0; i < 5; i++) {
            nx = x+dx[i];
            ny = y+dy[i];
            state[nx][ny] = !state[nx][ny];
        }
    }
    
    bool isEmpty(int n) {
        for(int j = 1; j <= m; j++) {
            if(state[n][j])
                return false;
        }
        return true;
    }
    
    void solve(int st) {
        memcpy(state, grid, sizeof(grid));
        memset(tmp, 0, sizeof(tmp));
    
        int cnt = 0;
        for(int j = 0; j < m; j++) {
            if((st>>j) & 1) {
                flip(1, j+1);
                cnt++;
            }
        }
    
        for(int i = 2; i <= n; i++) {
            for(int j = 1; j <= m; j++) {
                if(state[i-1][j] == 1) {
                    flip(i, j);
                    cnt++;
                }
            }
        }
    
        if(isEmpty(n) && cnt < ans) {
            ans = cnt;
            memcpy(rec, tmp, sizeof(tmp));   ///复制数组,第一次用!!!
        }
    }
    
    int main() {
        while(scanf("%d%d", &n, &m) != EOF) {
            for(int i = 1; i <= n; i++) {
                for(int j = 1; j <= m; j++) {
                    scanf("%d", &grid[i][j]);
                }
            }
    
            ans = INF;
            int end = 1 << m;
    
            for(int st = 0; st < end; st++)
                solve(st);
    
            if(ans == INF)
                puts("IMPOSSIBLE");
            else {
                for(int i = 1; i <= n; i++) {
                    printf("%d", rec[i][1]);
                    for(int j = 2; j <= m; j++)
                        printf(" %d", rec[i][j]);
                    puts("");
                }
            }
        }
        return 0;
    }
    


    POJ 1495

    http://blog.csdn.net/u014665013/article/details/51334889?locationNum=1&fps=1


    POJ 3414 Pots

    http://blog.csdn.net/u014665013/article/details/51336434?locationNum=1&fps=1




  • 相关阅读:
    R语言统计词频 画词云
    Bootstrap抽样(自展法)
    基于adt-bundle-windows-x86的android开发环境搭建
    逆分布函数法生成随机数(指数分布) R语言实现
    2016-ccf-data-mining-competition 搜狗用户画像构建
    算法第四版 在Linux 中调用Algs4库
    解决Ubuntu Chrome浏览器很卡不响应的问题
    Linux下安装系统清理软件 BleachBit 1.4
    C语言编程-9_4 字符统计
    C++调用Matlab函数求特征值
  • 原文地址:https://www.cnblogs.com/zswbky/p/6717900.html
Copyright © 2011-2022 走看看