題目:編輯圖像的二維數組,存在題目中的跟中操作(存在非法操作,直接跳過不處理);
分析:圖論、搜索。直接模擬處理即可,這裡用floodfill處理K操作,注意dfs可能會暴棧。
說明:注意坐標可能不是升序的,所以要先交換。
#include <stdio.h>
#include <stdlib.h>
char bmp[256][256];
char name[1000];
void floodfill(int n, int m, int y, int x, char s, char t)
{
if (y < 1 || y > n || x < 1 || x > m || bmp[y][x] != s) {
return;
}
bmp[y][x] = t;
floodfill(n, m, y, x+1, s, t);
floodfill(n, m, y, x-1, s, t);
floodfill(n, m, y+1, x, s, t);
floodfill(n, m, y-1, x, s, t);
}
void swap(int &a, int &b)
{
int c = a;
a = b;
b = c;
}
int main()
{
char buf[100], color[100];
int row = 0, column = 0, X, Y, X1, Y1, X2, Y2;
while (scanf("%s", &buf) && buf[0] != 'X') {
if (buf[0] == 'I' || buf[0] == 'C') {
if (buf[0] == 'I') {
scanf("%d%d", &column, &row);
}
for (int i = 1; i <= row; ++ i) {
for (int j = 1; j <= column; ++ j) {
bmp[i][j] = 'O';
}
}
}else if (buf[0] == 'L') {
scanf("%d%d%s", &X, &Y, color);
bmp[Y][X] = color[0];
}else if (buf[0] == 'V') {
scanf("%d%d%d%s", &X, &Y1, &Y2, color);
if (Y1 > Y2) {
swap(Y1, Y2);
}
for (int i = Y1; i <= Y2; ++ i) {
bmp[i][X] = color[0];
}
}else if (buf[0] == 'H') {
scanf("%d%d%d%s", &X1, &X2, &Y, color);
if (X1 > X2) {
swap(X1, X2);
}
for (int i = X1; i <= X2; ++ i) {
bmp[Y][i] = color[0];
}
}else if (buf[0] == 'K') {
scanf("%d%d%d%d%s", &X1, &Y1, &X2, &Y2, color);
if (Y1 > Y2) {
swap(Y1, Y2);
}
if (X1 > X2) {
swap(X1, X2);
}
for (int i = Y1; i <= Y2; ++ i) {
for (int j = X1; j <= X2; ++ j) {
bmp[i][j] = color[0];
}
}
}else if (buf[0] == 'F') {
scanf("%d%d%s", &X, &Y, color);
if (bmp[Y][X] != color[0]) {
floodfill(row, column, Y, X, bmp[Y][X], color[0]);
}
}else if (buf[0] == 'S') {
scanf("%s", name);
puts(name);
for (int i = 1; i <= row; ++ i) {
for (int j = 1; j <= column; ++ j) {
printf("%c",bmp[i][j]);
}
puts("");
}
}
}
return 0;
}