当前位置:编程学习 > C/C++ >>

UVA 10267 - Graphical Editor

/*
* 10267 - Graphical Editor
* 作者 仪冰
* QQ 974817955
*
* 【题意】
* 根据命令符号操作就行了。
* I M N 建立一个M列N行的图
* C 清空所有的颜色,用0表示
* L X Y C 在点(X,Y)处涂上颜色C
* V X Y1 Y2 C 在X列上的区间Y1-Y2涂上颜色C
* H Y X1 X2 C 在Y行上的区间X1-X2涂上颜色C
* K X1 Y1 X2 Y2 C 把左上角(X1,Y1)到右下角(X2,Y2)所组成的矩形涂上颜色C
* F X Y C 把点(X,Y)的上下左右四个方向上的点涂上颜色C,
*         条件是原来的颜色和点(X,Y)相同;
*         然后把涂上颜色C的点做为新的点和前面相同的条件继续操作,直到涂完为止。
* S name  输出name
* X 退出,程序结束
*
* 如果碰到没有的操作符,忽略掉,重新输入

* 【样例输入】
I 5 6
L 2 3 A
S one.bmp
G 2 3 J
F 3 3 J
V 2 3 4 W
H 3 4 2 Z
S two.bmp
X
* 【样例输出】
one.bmp
OOOOO
OOOOO
OAOOO
OOOOO
OOOOO
OOOOO
two.bmp
JJJJJ
JJZZJ
JWJJJ
JWJJJ
JJJJJ
JJJJJ
*/
#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int SIZE = 255;

void DFS(int X, int Y, char symColor, char symPrevious);

int coordinate[4][2] = {{-1,0}, {0,1}, {1,0}, {0,-1}}; //四个方向的边界数组

int M;              //横坐标,在数组中代表列
int N;              //纵坐标,在数组中代表行
char table[SIZE][SIZE]; //存储符号表里的信息

int main()
{
    char ch;
    char symbol;      //操作符
    char symColor;    //颜色涂抹符
    char symPrevious; //涂抹之前的颜色


    int X;     //横坐标点
    int Y;     //纵坐标点,下面同理
    int X1;
    int X2;
    int Y1;
    int Y2;
    int i, j;

    char strName[1100];  //图形的名字,输出数据时原样输出此名字

    memset(table, '\0', sizeof(table));

    while (1)
    {
        scanf("%c", &symbol);

        if (symbol == 'X')
        {
            break;
        }

        switch (symbol)
        {
            case 'I':
                 scanf("%d%d", &M, &N);
                 for (i=1; i<=N; i++)  //初始化,都为字符0
                 {
                     for (j=1; j<=M; j++)
                     {
                         table[i][j] = 'O';
                     }
                 }
                 break;

            case 'C':
                 for (i=1; i<=N; i++)  //清除所有的颜色,都变为0
                 {
                     for (j=1; j<=M; j++)
                     {
                         table[i][j] = 'O';
                     }
                 }
                 break;

            case 'L':
                 scanf("%d%d%*c%c", &X, &Y, &symColor);
                 table[Y][X] = symColor;
                 break;

            case 'V':
                 scanf("%d%d%d%*c%c", &X, &Y1, &Y2, &symColor);
                 if (Y1 > Y2)
                 {
                     Y1 += Y2;
                     Y2 = Y1-Y2;
                     Y1 = Y1-Y2;
                 }
                 for (i=Y1; i<=Y2; i++)
                 {
                     table[i][X] = symColor;
                 }
                 break;

            case 'H':
                 scanf("%d%d%d%*c%c", &X1, &X2, &Y, &symColor);
                 if (X1 > X2)
                 {
                     X1 += X2;
                     X2 = X1-X2;
                     X1 = X1-X2;
                 }
                 for (i=X1; i<=X2; i++)
                 {
                     table[Y][i] = symColor;
                 }
                 break;

            case 'K':
                 scanf("%d%d%d%d%*c%c", &X1, &Y1, &X2, &Y2, &symColor);
                 if (X1 > X2)
                 {
                     X1 += X2;
                     X2 = X1-X2;
                     X1 = X1-X2;
                 }
                 if (Y1 > Y2)
                 {
                     Y1 += Y2;
                     Y2 = Y1-Y2;
                     Y1 = Y1-Y2;
                 }
                 for (i=Y1; i<=Y2; i++)
                 {
                     for (j=X1; j<=X2; j++)
                     {
                         table[i][j] = symColor;
                     }
                 }
                 break;

            case 'F':
                 scanf("%d%d%*c%c", &X, &Y, &symColor);
                 if (symColor == table[Y][X])  //如果涂抹的颜色和原来的颜色相同不作处理,不然,调用DFS函数,递归会进入死循环
                 {
                     break;
                 }
                 symPrevious = table[Y][X];  //记下此时的颜色
                 DFS(Y, X, symColor, symPrevious);
                 break;

            case 'S':
                 getchar();
                 gets(strName);
                 puts(strName);
                 for (i=1; i<=N; i++)
                 {
                     for (j=1; j<=M; j++)
                     {
                         printf("%c", table[i][j]);
                     }
                     printf("\n");
                 }
                 break;

            default : break;
        }
    }
    return 0;
}

//深度优先搜索
void DFS(int X, int Y, char symColor, char symPrevious)
{
    table[X][Y] = symColor;

    int XX;
    int YY;
    int i;

    for (i=0; i<4; i++)
    {
        XX = X+coordinate[i][0];
        YY = Y+coordinate[i][1];

        //判断是否越界
        if ((XX<1) || (XX>N) || (YY<1) || (YY>M))
        {
            continue;
        }

        if (table[XX][YY] == symPrevious)
        {
            DFS(XX, YY, symColor, symPrevious);
        }
    }

    return ;
}

 

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,