麻将桌绘制
一年一度的日麻大赛就要开始啦,各位雀士狭路相逢勇者胜。除了赛场上大家的巅峰精彩对决以外,为了增加比赛的观赏性,还需要一个好看的牌桌,那你帮设计师绘制一个牌桌吧。
比赛在一张长为w,宽为h的桌子上进行绘制,为了方便描述,我们进行了以下定义:
我们把桌子可以分成w×h个方格,每个方格的大小为1×1。
我们定义方格的中心点为其坐标。
因此对于每个中心点(x,y),其实际方格范围为x′∈[x−0.5,x+0.5],y′∈[y−0.5,y+0.5]。
点(0,0)在左上角格子的中心。
点(w−1,0)在左下角格子的中心。
点(0,h−1)在右上角格子的中心。
点(w−1,h−1)在右下角格子的中心。
设计师圈出了一个圆和一个正方形,想在这些格子上贴上麻将logo,具体要求如下:
对于圆C,给出它的圆心坐标(xC,yC)和其半径r。当且仅当格子的中心点到半径的距离不超过r时,这个格子会被贴上麻将logo。如下图所示。
对于正方形,按照顺时针顺序给出其一条边的两个顶点坐标(x1,y1),(x2,y2)。当且仅当格子的中心点在这个矩形的边上或内部的时候,这个格子会被贴上麻将logo。给定的边保证和坐标轴平行。如下图所示。
现在给你这个牌桌的长和宽,以及圆形和矩形的信息,请你帮忙绘制出整张牌桌。如果不需要贴麻将logo的,请输出'∖',否则请输出'/'(不含引号)。你的输出应该保证牌桌的左上角在你输出的第一个字符。
input
输入数据共三行,第一行包括两个整数w,h(10≤w,h≤200),表示麻将桌的长和宽。
第二行包括三个整数xC,yC,r(−100≤xC,yC≤200,0<r≤200),表示圆的圆心和半径。
第三行包括四个整数x1,y1,x2,y2(−100≤x1,y1,x2,y2≤200),表示矩形的两个端点。
output
输出共w行,每行h个字符,为'∖'或'/'(不含引号)。
input
11 11 5 5 5 4 3 4 7
output
\\/\\ \///////\ ///////// ///////// ///////// /////////// ///////// ///////// ///////// \///////\ \\/\\
注意:对于正方形,按照顺时针顺序给出其一条边的两个顶点坐标(x1,y1),(x2,y2)。需要分4种情况讨论一下。坑QAQ
#include<stdio.h> #include<iostream> #include<algorithm> using namespace std; char mp[250][250]; int x,y,r; int ok1(int tx,int ty){ if((tx-(x))*(tx-(x))+(ty-(y))*(ty-(y))<=r*r){ return 1; }else{ return 0; } } int main(){ int w,h; int x1,y1,x2,y2; scanf("%d%d",&w,&h); scanf("%d%d%d",&x,&y,&r); scanf("%d%d%d%d",&x1,&y1,&x2,&y2); for(int i=0;i<=w;i++) for(int j=0;j<=h;j++) mp[i][j]='\'; int flag=0; int a1,a2,b1,b2; if(x1==x2){ int dis=abs(y1-y2); if(y1<y2){ a1=x1;b1=y1; a2=x1+dis;b2=y2; }else{ a1=x2-dis;b1=y2; a2=x1;b2=y1; } } if(y1==y2){ int dis=abs(x1-x2); if(x1<x2){ a1=x1;b1=y1-dis; a2=x2;b2=y2; }else{ a1=x2;b1=y2; a2=x1;b2=y1+dis; } } for(int i=0;i<w;i++){ for(int j=0;j<h;j++){ int xx=i; int yy=j; if(ok1(xx,yy)){ mp[i][j]='/'; } if(i>=a1&&i<=a2&&j>=b1&&j<=b2){ mp[i][j]='/'; } } } for(int i=0;i<w;i++){ for(int j=0;j<h;j++){ printf("%c",mp[i][j]); } printf(" "); } return 0; }
AC代码: