ccf csp认证第6次T3:画图

被坐标系给坑到了,看了很久的代码,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;
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值