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

问题描述:
枚举-画家问题(算法基础 第2周)_第1张图片
枚举-画家问题(算法基础 第2周)_第2张图片
分析:
不好意思了,课程的题目不注册没法看,只能贴图。
原题是POJ上的:http://cxsjsxmooc.openjudge.cn/test/Y/
有一小点改动,即课程要求可以输入多个案例。
这道题跟熄灯问题很像啦。
源码:

#include 
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; rfor (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 (steps1][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//初始化
        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; i1; i++) {
            for (int j=1; j1; j++){              
                cin >> color;
                wall[i][j] = color=='y' ? 0:1;
            }
        }
        //枚举
        minsteps = enumerate(wall_size);
        if (minsteps>1000){
            cout << "inf" << endl;
        }
        else {
            cout << minsteps << endl;
        }
    }

}

你可能感兴趣的:(程序设计与算法)