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++ ,