【发布时间】:2014-04-21 05:04:08
【问题描述】:
Photoshop 等图形编辑器允许我们更改位图图像,就像文本编辑器允许我们修改文档一样。图像表示为 M x N 像素数组,其中每个像素都有给定的颜色。
你的任务是编写一个模拟简单交互式图形编辑器的程序。
输入
输入由一系列编辑器命令组成,每行一个。每个命令由一个大写字母表示,该大写字母作为该行的第一个字符。如果命令需要参数,它们将在同一行给出,以空格分隔。
像素坐标由两个整数表示,列号介于 1...M 之间,行号介于 1...N 之间,其中 1$ \le$M,N$ \le$250。原点位于表格的左上角。颜色由大写字母指定。
编辑器接受以下命令:
I M N 创建一个新的 M x N 图像,所有像素最初都是白色 (O)。 C 通过将所有像素设置为白色 (O) 来清除表格。大小保持不变。 L X Y C 以颜色 (C) 为像素 (X, Y) 着色。 V X Y1 Y2 C 在 Y1 和 Y2 行之间(包括 Y1 和 Y2 行)在 X 列中绘制一条颜色 (C) 的垂直线段。 H X1 X2 Y C 在 X1 和 X2 列(包括 X1 和 X2 列)之间的 Y 行中画一条颜色 (C) 的水平线段。 K X1 Y1 X2 Y2 C 画一个颜色为 C 的填充矩形,其中 (X1, Y1) 是左上角, (X2, Y2) 是右下角。 F X Y C 用颜色 C 填充区域 R,其中 R 定义如下。像素(X,Y)属于R。任何其他与像素(X,Y)颜色相同并且与R中的任何像素共用边的像素也属于该区域。 S 名称 以 MSDOS 8.3 格式写入文件名,后跟当前图像的内容。 X 终止会话。 输出
在每个命令 S NAME 上,打印文件名 NAME 和当前图像的内容。每行由每个像素的颜色内容表示。查看示例输出。
忽略由 I、C、L、V、H、K、F、S 或 X 以外的字符定义的任何命令的整行,并传递到下一个命令。如果出现其他错误,程序的行为是不可预测的。
示例输入
我 5 6
L 2 3 A
S one.bmp
G 2 3 日
F 3 3 日
V 2 3 4 瓦
H 3 4 2 Z
S二.bmp
X
样本输出
一个.bmp
噢噢噢
噢噢噢
噢噢噢
噢噢噢
噢噢噢
噢噢噢
两个.bmp
JJJJJ
JJZZJ
JWJJJ
JWJJJ
JJJJJ
JJJJJ
这是我的代码。它使用 gcc 编译器编译,但不会像我预期的那样创建 char 数组。指针或malloc有什么问题吗?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char **Pixel;
int *m, *n;
void Create(int m, int n) {
int i, j;
Pixel = malloc(sizeof (char*)*n * n);
for (i = 0; i < m * n; i++)
Pixel[i] = malloc(sizeof (char*)*m);
for (i = 0; i < m; i++)
for (j = 0; j < n; j++) {
Pixel[i][j] = '0';
}
}
void ColorOneSpot(int x, int y, char color) {
Pixel[x - 1][y - 1] = color;
}
void ColorColumn(int x, int y1, int y2, char color) {
int i;
for (i = y1; i <= y2; i++)
Pixel[x - 1][i] = color;
}
void ColorRow(int x1, int x2, int y, char color) {
int i;
for (i = x1; i <= x2; i++)
Pixel[i][y - 1] = color;
}
void ColorSquare(int *x1, int x2, int y1, int y2, char color) {
int i, j;
for (i = x1 - 1; i < x2; i++)
for (j = y1 - 1; j < y2; j++)
Pixel[i][j] = color;
}
void ColorNeighbor(int x, int y, char color) {
int i, j;
Pixel[y][x] = color;
for (i = x; i <= x + 2; i++)
if (i >= 0 && i <= m) {
for (j = y; j <= y + 2; j++) {
if (Pixel[i][j] == 0 && j >= 0 && j <= n)
Pixel[i][j] = color;
ColorNeighbor(x, y - 1, color);
ColorNeighbor(x, y + 1, color);
ColorNeighbor(x - 1, y, color);
ColorNeighbor(x + 1, y, color);
}
}
}
int main(void) {
int i, j;
char Input;
while (Input != 'X') {
int x, y, x1, y1, x2, y2;
char color, name[20];
scanf("%1s", &Input);
switch (Input) {
case 'I':
scanf("%d%d", &m, &n);
Create(*m, *n);
break;
case 'L':
scanf("%d%d%s", &x, &y, &color);
ColorOneSpot(x, y, color);
break;
case 'V':
scanf("%d%d%d%s", &x, &y1, &y2, &color);
ColorColumn(x, y1, y2, color);
break;
case 'H':
scanf("%d%d%d%s", &x1, &x2, &y, &color);
ColorRow(x1, x2, y, color);
break;
case 'K':
scanf("%d%d%d%d%s", &x1, &x2, &y1, &y2, &color);
ColorSquare(x1, x2, y1, y2, color);
break;
case 'F':
scanf("%d%d%s", &x, &y, &color);
ColorNeighbor(x, y, color);
break;
case 'S':
scanf("%s", &name);
printf("%s\n", name);
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++)
printf("%s ", Pixel[i][j]);
printf("\n");
}
break;
case 'X':break;
}
}
free(Pixel);
return 0;
}
【问题讨论】: