试题编号: | 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坐标)。 |
第一次提交只有60分,仔细检查以后,发现填充那一步存在错误。网上搜索别人的答案后发现很多人都用dfs实现。感觉很棒!还是自己做题太少了,没想到这个方法。
以下是提交后90分的c++程序代码,以后要是找到bug再更新QWQ
#include<iostream>
using namespace std;
char c[105][105];
int n,m,q,i,j,k;
int direct[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
void DFS(int i,int j,char f){
if(i<0||i>=n||j<0||j>=m||c[i][j]=='-'||c[i][j]=='|'||c[i][j]=='+'||c[i][j]==f) return;
c[i][j]=f;
for(int k=0;k<4;++k)
DFS(i+direct[k][0],j+direct[k][1],f);
}
int main(){
cin>>m>>n>>q;
for(i=0;i<n;i++){
for(j=0;j<m;j++){
c[i][j]='.';
}
}
i=1;
while(i<=q){
int op,x1,y1,x2,y2,a,b;
char fill;
cin>>op;
if(op==1){
cin>>x1>>y1>>fill;
DFS(n-1-y1,x1,fill);
}
if(op==0){
cin>>x1>>y1>>x2>>y2;
if(x1==x2){
if(y1>y2) a=y2,b=y1;//较小的坐标为a
else a=y1,b=y2;
for(j=n-b-1;j<=n-a-1;j++){
if(c[j][x1]!='-'){
c[j][x1]='|';
}else if(c[j][x1]=='-'){
c[j][x1]='+';
}
}
}
if(y1==y2){
if(x1>x2) a=x2,b=x1;//较小的坐标为a
else a=x1,b=x2;
for(j=a;j<=b;j++){
if(c[n-y1-1][j]!='|'){
c[n-y1-1][j]='-';
}else if(c[n-y1-1][j]=='|'){
c[n-y1-1][j]='+';
}
}
}
}
i++;
}
for(i=0;i<n;i++){
for(j=0;j<m;j++){
cout<<c[i][j];
}
cout<<endl;
}
return 0;
}
2020/02/04 感谢评论区朋友提出的建议~
确实忘了考虑多条线相交的情况(即该位本来就是‘+’时,应该画线结果仍然是‘+’)。只要在判断时再加上一句就好啦~
举个例子~因为这次是重新写的代码,变量名有所不同,g是字符数组。