画家问题

http://cxsjsxmooc.openjudge.cn/test/Y/

代码

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using std::cin;
using std::cout;
using std::endl;
int map[20][20];//草稿
int copy[20][20];//原始记录
int line[20];//第一行
char col[20];//输入缓冲区
int n;
int min;
int count;
void draw(int x,int y){//画画并且增加次数
    map[x][y]=!map[x][y];
    map[x-1][y]=!map[x-1][y];
    map[x+1][y]=!map[x+1][y];
    map[x][y-1]=!map[x][y-1];
    map[x][y+1]=!map[x][y+1];
    count++;
}
bool guess(){
    //从第二行开始 判断每个点上边的点是否为黄色 如果不是黄色 则涂该点
    for(int i=2; i<=n; i++)
        for(int j=1; j<=n; j++)
            if(map[i-1][j] == 0)
                draw(i,j);


    //判断最后一行是否都为黄色 如果是则记录次数 否则提交失败
    for(int k=1; k<=n; k++)
        if(map[n][k] != 1)
            return false;
    if(count < min)
        min = count;
    return true;
}
void getLine(int k){
    //二进制枚举第一行
    int j=n;
    while(j>0){
        line[j]=k%2;
        k/=2;
        j--;
    }
}
int main(){
    int w;
    cin>>w;
    while(w--){
        cin>>n;
        min=n*n+1;
        for (int i = 1; i <=n; ++i) {
            scanf("%s",col);
            //一行一行扫描
            for (int j = 1; j <=n ; ++j) {
                if(col[j-1]=='w'){
                    copy[i][j]=0;
                }
                else{
                    copy[i][j]=1;
                }
            }
        }
        //开始枚举
        for (int k = 0; k <pow(2,n) ; ++k) {
            count=0;
            memcpy(map,copy, sizeof(copy));
            getLine(k);
            //枚举第一行
            for (int i = 1; i <=n ; ++i) {
                if(line[i]==1){
                    draw(1,i);
                }
            }
            guess();
        }
        if(min!=n*n+1){
            cout<<min<<endl;
        }
        else{
            cout<<"inf"<<endl;
        }
    }
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,067评论 19 139
  • 一、实验目的 学习使用 weka 中的常用分类器,完成数据分类任务。 二、实验内容 了解 weka 中 explo...
    yigoh阅读 8,662评论 5 4
  • 1.本书讲的是如何建立个人影响力,影响力就是有创意地表现自己; 2.分别按照CREAT各因子阐释,并说明如何行动,...
    幽明阅读 602评论 0 1
  • 连续更了三天的帖子,不小心爬上了一次:简书首页&&手绘公众号,够我得瑟一下了。(hh......hhh!)今天文末...
    Double_Hui阅读 1,495评论 33 47
  • 一、monkeyrunner简介 脚本工具,有三个模块:monkeyrunner、monkeydevice、mon...
    兼葭dx阅读 307评论 0 0