题目:http://118.190.20.162/view.page?gpid=T35
大意:给定一些操作,需要输出最后画出的图案
思路
①初始化所有的图案为".",这里以a[i][j]作为坐标(i, j),输出时记得翻转一下
②划线操作:首先要判断是水平/竖直,其次看需要划线的格子是否可能变为"+"
③填充操作:其实就是DFS,遇到已经标记过的或者线段就停止
总的来说,这题按部就班来就好了,不是特别难,也没什么坑点
C++满分代码
#include <iostream>
#include <cstring>
using namespace std;
int m,n,q;
bool op;
char g[105][105];
bool is_legal(int x, int y) //判断点是否在内部
{
if(x>=0 && x<m && y>=0 && y<n) return 1;
else return 0;
}
void init() //初始化
{
for(int i=0; i<m; ++i)
for(int j=0; j<n; ++j)
g[i][j] = '.';
}
int x1,x2,y1,y2;
void print_line() //划线
{
if(y1 == y2)
{
int x_min = min(x1,x2);
int x_max = max(x1,x2);
for(int i=x_min; i<=x_max; ++i)
{
if(g[i][y1] == '+' || g[i][y1] == '|') g[i][y1] = '+';
else g[i][y1] = '-';
}
}
else
{
int y_min = min(y1,y2);
int y_max = max(y1,y2);
for(int i=y_min; i<=y_max; ++i)
{
if(g[x1][i] == '+' || g[x1][i] == '-') g[x1][i] = '+';
else g[x1][i] = '|';
}
}
}
int a,b;
char c; //待填充的字符
bool vis[105][105]; //标记是否填充过了
void fill_char(int a, int b) //填充
{
if(is_legal(a,b) == 0 || vis[a][b] == 1 || g[a][b] == '-' || g[a][b] == '|' || g[a][b] == '+')
return;
g[a][b] = c;
vis[a][b] = 1;
fill_char(a-1,b); //上下左右
fill_char(a+1,b);
fill_char(a,b-1);
fill_char(a,b+1);
}
void print_graph()
{
for(int j=n-1; j>=0; --j) //上下倒置输出
{
for(int i=0; i<m; ++i)
cout<<g[i][j];
if(j!=0) cout<<"\n";
}
}
int main()
{
ios::sync_with_stdio(false);
cin>>m>>n>>q;
init();
while(q--)
{
cin>>op;
if(op==0)
{
cin>>x1>>y1>>x2>>y2;
print_line();
}
else
{
cin>>a>>b>>c;
memset(vis,0,sizeof(vis));
fill_char(a,b);
}
}
print_graph();
return 0;
}