G 2 3 J
F 3 3 J
V 2 3 4 W
H 3 4 2 Z
S two.bmp
X
Sample Output
one.bmp
OOOOO
OOOOO
OAOOO
OOOOO
OOOOO
OOOOO
two.bmp
JJJJJ
JJZZJ
JWJJJ
JWJJJ
JJJJJ
JJJJJ
思路:刚开始一个没想通Fill函数的意思,后来我问了别人才知道,从一开始建立一个图像,后面的命令都是在修改这个图形,也就是说在two.bmp中使用的命令,是在one.bmp里面进行修改得到的图形,当时我理解的是two.bmp是一个新的图形,所以一直未能理解fill函数的意义。
通过一个switch 来解决问题,然后显示那些命令。
关于fill函数,我但是用到一个递归,来查找旁边与之相同的颜色,这也是图论里面深度搜索的一个知识点。
代码:
#include <stdio.h>
int M,N;
//将图像清除,并且将所有涂成白色
void reset(char *s){//N 为行,M为列
int i,j;
for(i = 0 ;i < N;i++){
for(j = 0;j < M;j++)
*(s + i*N+j) = 'o';
printf("\n");
}
}
//把像素(x,y)涂成新的颜色,即 new_color
void ser_pixel(char *s,int x,int y,char new_color){
*(s + x*N+y) = new_color;
}
//将左上角(x1,y1)到(x2,y2)形成的矩形,涂成颜色 new_color
void file_rect(char *s,int x1,int y1,int x2,int y2,char new_color){
int i,j;
for(i = x1;i <= x2;i++){
for(j = y1;j <= y2;j++)
*(s + i*N + j) = new_color;
printf("\n");
}
}
//将某区域涂成新颜色 new_color
void fill_region(char *s,int x,int y,char old_color,char new_color){//x 为 行,y 为 列
// 当新旧颜色相同时需要结束递归,否则会形成无限循环。
if (old_color == new_color)
return;
*(s + x*N + y) = new_color;
if (x > 0)
if (*(s + (x-1)* N + y) == old_color)
fill_region(s, x - 1, y, old_color, new_color);
if (x < N - 1)
if (*(s + (x+1)* N + y) == old_color)
fill_region(s, x + 1, y, old_color, new_color);
if (y > 0)
if (*(s + x*N+ y-1) == old_color)
fill_region(s, x, y - 1, old_color, new_color);
if (y < M - 1)
if (*(s + x* N + y+1) == old_color)
fill_region(s, x, y + 1, old_color, new_color);
}
int main(){
int i,j,x1,x2,y1,y2,x,y;
char cmd,color;
//scanf("%d %d",&M,&N);
char pixel[250][250];
while(scanf("%c",&cmd) != 'X'){
switch(cmd){
case 'I':
scanf("%d %d",&M,&N);
for(i = 0;i < N;i++){
for(j =0;j < M;j++)
printf("o");
printf("\n");
}
break;
case 'C':
reset(&pixel[0][0]);
break;
case 'L':
scanf("%d %d %c",&x,&y,&color);
ser_pixel(&pixel[0][0], x, y,color);
break;
case 'V':
scanf("%d %d %d %c",&y1,&x1,&x2,&color);
for(x = x1;x <= x2;x++)
pixel[x-1][y1-1] = color;
break;
case 'H':
scanf("%d %d %d %c",&y1,&y2,&x1,&color);
for(y = y1;y <= y2;y++)
pixel[x1-1][y-1] = color;
break;
case 'K':
scanf("%d %d %d %d %c",&x1,&y1,&x2,&y2,&color);
file_rect(&pixel[0][0], x1, y1, x2, y2,color);
break;
case 'F':
scanf("%d %d %c",&x,&y,&color);
fill_region(&pixel[0][0], x, y,pixel[x][y],color);
break;
}
system("pause");
}
}