枚举-画家问题(算法基础 第2周)

问题描述:
枚举-画家问题(算法基础 第2周)_第1张图片

分析:
不好意思了,课程的题目不注册没法看,只能贴图。
原题是POJ上的:http://cxsjsxmooc.openjudge.cn/test/Y/
有一小点改动,即课程要求可以输入多个案例。
这道题跟熄灯问题很像啦。
源码:

#include <iostream>
using namespace std;

int wall[16][17]={0},press[16][17]={0};
//黄色为0,白色表示1
/* 推测验证过程: 根据第一行猜测 */
int guess(const int& wallsize) {    
    //根据press第1行和wall数组,计算press其他行的值
    for (int r=1; r<wallsize; r++) {
        for (int c=1; c<=wallsize; c++) {
            press[r+1][c]=(wall[r][c]+press[r][c]+press[r-1][c]+press[r][c-1]+press[r][c+1])%2;
        }
    }
    //判断所计算的press数组能否将最后一行全变为黄色0
    for(int c=1; c<=wallsize; c++) {
        if ((press[wallsize][c-1]+press[wallsize][c]+press[wallsize][c+1]+press[wallsize-1][c])%2 != wall[wallsize][c]) {
            return 1001;            
        }
    }
    //算出需要的步数
    int steps=0;
    for (int r=1; r<=wallsize; r++) {
        for (int c=1; c<=wallsize; c++) {
            if (press[r][c]==1) {
                steps++;
            }
        }
    }
    return steps;
}
/* 枚举过程: 对press第1行的元素press[1][1]~press[1][6]的各种取值进行枚举 */
int enumerate(const int& wallsize) {
    int minsteps=1001;
    int steps=0;
    int c;
    while (press[1][wallsize+1]<1){
        steps = guess(wallsize);
        if (steps<minsteps){
            minsteps = steps;
        }       
        press[1][1]++;
        c=1;
        while(press[1][c]>1) {
            press[1][c]=0;
            c++;
            press[1][c]++;
        }
    }
    return minsteps;
}

int main() {
    int cases=0;
    cin >> cases;
    char color;
    int wall_size=0;
    int minsteps=0;
    for(int k=0; k<cases; k++) {    
        //初始化
        for (int r=0; r<16; r++){
            for (int c=0; c<17; c++){
                wall[r][c]=0;
                press[r][c]=0;
            }
        }
        //输入数据
        cin >> wall_size;
        for(int i=1; i<wall_size+1; i++) {
            for (int j=1; j<wall_size+1; j++){              
                cin >> color;
                wall[i][j] = color=='y' ? 0:1;
            }
        }
        //枚举
        minsteps = enumerate(wall_size);
        if (minsteps>1000){
            cout << "inf" << endl;
        }
        else {
            cout << minsteps << endl;
        }
    }

}

你可能感兴趣的:(算法)