阅读背景:

赏月斋源码共享计划 第三期

来源:互联网 
/**
 * 需求描述:
 * 有一块N*M像素格的画板,初始状态空白,用‘X’表示
 * 绘画规则为:每次选择一条斜线 
 * 如果斜线斜率为1,则选择一段格子,都涂为蓝色,用‘B’表示
 * 如果斜线斜率为-1,则选择斜线中的一段格子,涂成黄色,用‘Y’表示
 * 一个格子既涂成蓝色又涂成黄色,则变成绿色,用‘G’表示
 * 已知一幅作品,求最少需要多少次操作完成这幅画
 * *****************************************
 * 输入:正整数N,M
 * 画作:N行长度为M的字符串
 * 
 *
 * */
# include <stdio.h>
char str[60][60];
int m, n;

void dfs_Y(int x, int y){ //斜率-1,涂黄色Y
    if (x >= 0 && x < n && y >=0 && y < m && (str[x][y] == 'Y' || str[x][y] == 'G')){
        if(str[x][y] == 'G'){
            str[x][y] = 'B';
        }
        else
        {
            str[x][y] = 'X';
        }
        dfs_Y(x - 1, y - 1);
        dfs_Y(x + 1, y + 1);
    }

    return;
}

void dfs_B(int x, int y){  //斜率1,涂蓝色B
    if(x >= 0 && x < n && 0 <= y && y <m && (str[x][y] == 'B' || str[x][y] == 'G')){
        if (str[x][y] == 'G'){
            str[x][y] = 'Y';
        }
        else
        {
            str[x][y] = 'X';
        }
        dfs_B(x + 1, y - 1);
        dfs_B(x - 1, y + 1);
    }

    return;
}

int main(void){
    int cnt;
    scanf("%d%d", &n, &m);
    for (int i = 0; i < n; i++)
    {
        scanf("%s", str[i]);
    }
    cnt = 0;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            if (str[i][j] == 'Y')
            {
                dfs_Y(i, j);
                cnt++;
            }
            else if (str[i][j] == 'B')
            {
                dfs_B(i, j);
                cnt++;
            }
            else if (str[i][j] == 'G')
            {
                dfs_Y(i, j);
                str[i][j] = 'B';
                dfs_B(i, j);
                cnt += 2;
            }
        }
        }
    printf("%d\n", cnt);  //无论初始str是什么图案,执行完计算过程之后str全变成'X'
    
    //测试用:
    // for (int i = 0; i < 4; i++)
    // {
    //     for (int j = 0; j < 4; j++)
    //     {
    //         printf("%c", str[i][j]);
    //     }
    //     printf("\n");
    // }

    return 0;
}
/**
 * 需求描述:
 * 有一块N*M像素格的画板,初始状态空白,用‘X’表示
 



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: