题目链接地址 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 ;
}
该博客介绍了UVA在线判题系统中的一道题目10267,这是一个关于图形编辑器的问题。内容可能涉及算法设计、编程实现以及解题思路。
2655

被折叠的 条评论
为什么被折叠?



