问题描述
试题编号: | 201512-3 |
试题名称: | 画图 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 用 ASCII 字符来画图是一件有趣的事情,并形成了一门被称为 ASCII Art 的艺术。例如,下图是用 ASCII 字符画出来的 CSPRO 字样。 输入格式 第1行有三个整数m, n和q。m和n分别表示画布的宽度和高度,以字符为单位。q表示画图操作的个数。 输出格式 输出有n行,每行m个字符,表示依次执行这q个操作后得到的画图结果。 样例输入 4 2 3 样例输出 AAAA 样例输入 16 13 9 样例输出 ................ 评测用例规模与约定 所有的评测用例满足:2 ≤ m, n ≤ 100,0 ≤ q ≤ 100,0 ≤ x < m(x表示输入数据中所有位置的x坐标),0 ≤ y < n(y表示输入数据中所有位置的y坐标)。 |
简单的模拟题,读懂题意即可,代码如下,详见注释:
#include<iostream>
using namespace std;
char paint[110][110];
int m,n;
//递归填充字符,要对每次递归都做好边界条件判断
void dfs(int x,int y,char a)
{
paint[x][y]=a;
if(x>0 && paint[x-1][y]!='-' && paint[x-1][y]!='|' && paint[x-1][y]!='+' && paint[x-1][y]!=a)
dfs(x-1,y,a);
if(x<n-1 && paint[x+1][y]!='-' && paint[x+1][y]!='|' && paint[x+1][y]!='+' && paint[x+1][y]!=a)
dfs(x+1,y,a);
if(y>0 && paint[x][y-1]!='-' && paint[x][y-1]!='|' && paint[x][y-1]!='+' && paint[x][y-1]!=a)
dfs(x,y-1,a);
if(y<m-1 && paint[x][y+1]!='-' && paint[x][y+1]!='|' && paint[x][y+1]!='+' && paint[x][y+1]!=a)
dfs(x,y+1,a);
}
int main()
{
int q;
//重点!!m表示宽度,n表示长度,即m表示二维数组的列,n表示行,所以后面对数组进行访问都要将行和列颠倒一下
cin>>m>>n>>q;
//初始化数组
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
paint[i][j]='.';
while(q--)
{
int op;
//输入操作类型
cin>>op;
if(op==1)
{
int x,y;
char a;
cin>>x>>y>>a;
dfs(y,x,a);
}
else if(op==0)
{
int x1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;
if(x1==x2)
{
//y1和y2的大小关系不确定,判断一下
if(y1>y2)
{
int temp=y1;
y1=y2;
y2=temp;
}
for(int i=y1;i<=y2;i++)
{
//重点,要注意到当前位置的字符可能为+,不然这个程序只有90分
if(paint[i][x1]=='-' || paint[i][x1]=='+')
paint[i][x1]='+';
else
paint[i][x1]='|';
}
}
if(y1==y2)
{
//x1和x2的大小关系不确定,判断一下
if(x1>x2)
{
int temp=x1;
x1=x2;
x2=temp;
}
for(int i=x1;i<=x2;i++)
{
//重点,要注意到当前位置的字符可能为+,不然这个程序只有90分
if(paint[y1][i]=='|' || paint[y1][i]=='+')
paint[y1][i]='+';
else
paint[y1][i]='-';
}
}
}
}
//因为本题规定向上为x轴的正方向,所以要倒着输出行
for(int i=n-1;i>=0;i--)
{
for(int j=0;j<m;j++)
printf("%c",paint[i][j]);
cout<<endl;
}
return 0;
}