题目
思路
这道题只有两个操作,划线和填充。
划线:'-'
和'|'
可以覆盖'.'
,还可以相互覆盖成为'+'
,'+'
的优先级最高,不可被覆盖。
填充:利用BFS填充,并判断好边界。注意,多次填充,后面的可以覆盖前面的。
代码
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
int n, m;
struct position
{
int x;
int y;
};
char paint[101][101]; //图
int m_x[] = { 0,1,0,-1 }; //相邻方向移动位置
int m_y[] = { 1,0,-1,0 };
void draw()
{//画图操作
int x1, y1, x2, y2, max_x, min_x, min_y, max_y;
scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
if (x1 == x2 && y1 != y2)
{// 画"|"
min_y = min(y1, y2);
max_y = max(y1, y2);
for (int i = min_y; i <= max_y; i++)
{
if(paint[x1][i]!='+') //'+'优先级最高 不能被覆盖
if (paint[x1][i] == '-') //可以覆盖'-'为'+'
paint[x1][i] = '+';
else
paint[x1][i] = '|'; //画'|'
}
}
else if (x1 != x2 && y1 == y2)
{//画"-"
min_x = min(x1, x2);
max_x = max(x1, x2);
for (int i = min_x; i <= max_x; i++)
{
if(paint[i][y1]!='+')
if (paint[i][y1] == '|')
paint[i][y1] = '+';
else
paint[i][y1] = '-';
}
}
}
void fill()
{//BFS
int x, y;
char c;
scanf("%d %d %c", &x, &y, &c);
queue<position> q;
q.push({ x,y });
paint[x][y] = c;
while (!q.empty())
{
position now = q.front();
q.pop();
for (int i = 0; i < 4; i++)
{
position next;
next.x = now.x + m_x[i];
next.y = now.y + m_y[i];
if (next.x >= 0 && next.x <= n && next.y >= 0 && next.y <= m)
{//界内
if (paint[next.x][next.y] !='-'&& paint[next.x][next.y] != '|'&& paint[next.x][next.y] != '+'&&paint[next.x][next.y]!=c)
{//可移动方向
paint[next.x][next.y] = c;
q.push(next);
}
}
}
}
}
int main(int argc, char** argv)
{
freopen("in.txt", "r", stdin);
memset(paint, '.', sizeof(paint));
int q, tmp;
scanf("%d %d %d", &n, &m, &q);
for (int i = 0; i < q; i++)
{
scanf("%d", &tmp);
if (tmp == 0)
draw();
else if (tmp == 1)
fill();
}
for (int i = m-1; i >=0; i--) //打印 根据坐标 排列
{
for (int j = 0; j < n; j++)
{
printf("%c", paint[j][i]);
}
printf("\n");
}
return 0;
}
总结
我觉得这道题就是普通的BFS考察,没有什么难度。