问题描述
试题编号: | 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坐标)。 |
填充字符感觉有点像找连通图,但是我不会图好吧...又有点像找迷宫路线,也8会。那就只能递归找路线了,为了不重复地填充减少递归次数,用一个二维bool数组记录已经填充过的位置
关于填充线段,这个鬼题目有一点没说清楚的就是,如果画线段的时候遇到'+',那么'+'不会被覆盖,不考虑这点只有90分
还有就是注意输入时的m和n,m是宽度,也就是二维数组的列,n是高度,也就是二维数组的行......以及,输出别空格
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
const int N = 100;
int m, n, q;
char ch [N+1][N+1];
bool tag[N+1][N+1];
bool canFill(int x, int y)
{
return (ch[x][y]!='-' && ch[x][y]!='|' && ch[x][y]!='+');
}
void fillCh( int x, int y, char c)
{
if( !tag[x][y] && (x>=0&&y>=0) && (x<m&&y<n) )
{
ch[x][y] = c;
tag[x][y] = true;
if( x>0 && canFill(x-1,y) ) //左填
fillCh(x-1, y, c);
if( y>0 && canFill(x,y-1) ) //下填
fillCh(x, y-1, c);
if( x<m-1&& canFill(x+1,y) ) //右填
fillCh(x+1, y, c);
if( y<n-1&& canFill(x,y+1) ) //上填
fillCh(x, y+1, c);
}
}
int main()
{
ios::sync_with_stdio(false);
while( cin >> m >> n >> q )
{
int i, j;
for(i = 0; i < m; ++i)
for(j = 0; j < n; ++j)
ch[i][j] = '.';
while( q-- )
{
int opt, x1, y1, x2, y2;
cin >> opt;
if( opt == 0 ){
cin >> x1 >> y1 >> x2 >> y2;
if( x1 == x2 ){
i = min(y1, y2), j = max(y1, y2);
while( i <= j ){
ch[x1][i] = (ch[x1][i]=='-'||ch[x1][i]=='+') ? '+':'|';
++i;
}
}else{
i = min(x1, x2), j = max(x1, x2);
while( i <= j ){
ch[i][y1] = (ch[i][y1]=='|'||ch[i][y1]=='+') ? '+':'-';
++i;
}
}
}else if( opt == 1 ){
char c;
cin >> x1 >> y1 >> c;
memset(tag, 0, sizeof(tag));
fillCh(x1, y1, c);
}
}
for(j = n-1; j >= 0; --j){
for(i = 0; i < m; ++i)
cout << ch[i][j];
cout << endl;
}
}
return 0;
}
虽然实在是不够看,但是好歹能AC过对吧......(自我安慰...)