大佬解法:https://blog.csdn.net/richenyunqi/article/details/87871209
看了大佬的解法,有所感想并且想做一些解读。
算法设计:
首先定义一个nxm的二维数组graph来存储整个图形。把题目中的坐标转换成graph中的坐标,对于题目中的坐标(x,y),在graph中的坐标应该为(n-1-y,x)。这个画个图就比较好理解。
然后就是画图,画线段就很容易,填充图形要求该字符以及填充该字符的相邻位置,可以用DFS(深度优先遍历实)现,当坐标超过画布或者坐标是线段的一部分或者此位置已经填充过,即结束当前搜索,否则就填充,并对相邻四个坐标同样进行DFS。
注意点:
要考虑到x1>x2或者y1>y2的情况。
C++代码
#include<bits/stdc++.h>
using namespace std;
char graph[105][105]; //整个图
int m,n,q,command,direct[4][2] = {{-1,0},{0,1},{1,0},{0,-1}}; //四个方向,左右上下
void DFS(int i,int j,char c){//填充字符
if(i<0||i<=n||j<0||j>=m
||graph[i][j]=='-'||graph[i][j]=='|'||graph[i][j]=='+' //是线段的一部分
||graph[i][j]==c){ //已经填充过
return;
}
graph[i][j] = c;//进行填充
for(int k =0;k<4;++k){ //递归处理4个周边坐标
DFS(i+direct[k][0],j+direct[k][1],c);
}
}
int main(){
scanf("%d%d%d",&m,&n,&q);
memest(graph,'.',sizeof(graph)); //对字符数组进行填充
while(q--){
scanf("%d",&command);
if(command==0){ //画线
int y1,y2,x1,x2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if(x1>x2){ //x1存储x1和x2之间的最小值,x2存储 x1和x2之间的最大值
swap(x1,x2);
}
if(y1<y2){ //y1存储y1和y2之间的最小值,y2存储y1和y2之间的最大值
swap(y1,y2);
}
if(x1!=x2){ //y1=y2
for(int i = x1;i<=x2;++i){
if(graph[n-1-y1][i]=='|'||graph[n-1-i][x1]=='+'){
graph[n-1-y1][i] = '+';
}else{
graph[n-1-y1][i] = '-';
}
}
}else{ //x1=x2
for(int i = y1;i>=y2;--i){
if(graph[n-1-i][x1]=='-'||graph[n-1-i][x1]=='+'){
graph[n-1-i][x1]=='+';
}else{
graph[n-1-i][x1]=='|';
}
}
}
}else{
int x,y;
char c;
scanf("%d%d %c",&x,&y,&c);
DFS(n-1-y,x,c);
}
}
for(int i = 0;j<n;++i){
for(int j = 0;j<m;++j){
printf("%c",graph[i][j]);
}
puts("");
}
return 0;
}