被坐标系给坑到了,看了很久的代码,g[x][y],数组坐标,左上角(0,0),x沿着方向向下增加,y沿着方向向右增加
而数学坐标系,(x,y),左下角为(0,0),x沿着方向向右增加,y沿着方向向上增加,所以用数组来表示坐标系需要对y进行反转
详细解释g[x][y],数组坐标系:x增加,是行,向下增加的,y增加,是列,向右增加的,对比数学坐标系来说,g[x][y]在数学坐标系中表示为(y,x)
//这道题比较蛋疼的一个点在于输入的时候,采用的是数学坐标系,输出的时候采用的是数组坐标系
//需要对其进行转化一下
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110;
char g[N][N];
int n,m,q;
bool st[N][N];
void dfs(int x,int y,char c){
st[x][y]=true;
g[x][y]=c;
int dx[]={-1,0,1,0},dy[]={0,1,0,-1};
for(int i=0;i<4;i++){
int a=x+dx[i],b=y+dy[i];
if(a>=0 && a<m && b>=0 && b<n && !st[a][b]){
if(g[a][b]=='-' || g[a][b]=='|' || g[a][b]=='+') continue;
dfs(a,b,c);
}
}
}
int main()
{
scanf("%d%d%d", &m, &n,&q);
//对画布进行初始话
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
g[i][j]='.';
}
}
while(q--){
int op;
scanf("%d",&op);
if(op==0){//这个只能画直线和竖线,所以x1,x2之间,y1,y2之间肯定有一组是相等的
int x1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;
char c='-',d='|';//定义c,d也是为了方便操作
if(x1>x2) swap(x1,x2);
if(y1>y2) swap(y1,y2);//交换只是为了方便操作而已
if(x1==x2) swap(c,d);//如果x相等,说明只能画竖线
for(int i=x1;i<=x2;i++){
for(int j=y1;j<=y2;j++){
if(g[i][j]==d || g[i][j]=='+') g[i][j]='+';
else g[i][j]=c;
}
}
}
else{//如果是染色的话
int x,y;
char c;
cin >> x >> y >> c;
memset(st,0,sizeof st);//每次都要清0
dfs(x,y,c);
}
}
//用数组坐标系输出
//数学坐标系与数组坐标系的核心差异是 y 轴方向相反(数学坐标系 y 向上增大,数组 y 向下增大)。
//因此,转化的关键是将数学坐标系的 y 坐标映射到数组的行索引时,需要反转 y 轴。
for(int i=n-1;i>=0;i--){
for(int j=0;j<m;j++){
cout << g[j][i];
}
cout << endl;
}
return 0;
}