CCF-201512-3

我们先来看一下题目吧


解题思路
就是一个很平常的搜索题
1.我们要完成画线和填充,把他简化为两个函数再一一击破
注意点:
1.x1不一定大于x2,y1不一定大于y2,所以还要处理一下输入数据
2.输出格式还要y其实相当于i
代码
#include<iostream>
#include<cstring>
#define mm(a,b) memset(a,b,sizeof(a))
using namespace std;
const int maxn=100;
char map[maxn][maxn];
int x_dir[4]={0,0,-1,1};
int y_dir[4]={1,-1,0,0};
int m,n;
void line(int x1,int y1,int x2,int y2){
if(x1==x2){//|
if(y1>y2){
int temp=y1;
y1=y2;
y2=temp;
}
for(int i=y1;i<=y2;i++){
if(map[i][x1]=='+'||map[i][x1]=='-')
map[i][x1]='+';
else
map[i][x1]='|';
}
}
if(y1==y2){//-
if(x1>x2){
int temp=x1;
x1=x2;
x2=temp;
}
for(int i=x1;i<=x2;i++){
if(map[y1][i]=='+'||map[y1][i]=='|')
map[y1][i]='+';
else
map[y1][i]='-';
}
}
}
void fill(int x,int y,char c){
map[y][x]=c;
for(int i=0;i<4;i++){
int nx=x+x_dir[i];
int ny=y+y_dir[i];
if(nx<0||nx>=m||ny<0||ny>=n) continue;
if(map[ny][nx]!='-'&&map[ny][nx]!='|'&&map[ny][nx]!='+'&&map[ny][nx]!=c)
fill(nx,ny,c);
}
}
int main(){
int q;
cin>>m>>n>>q;
mm(map,'.');
while(q--){
int flag;
cin>>flag;
if(flag){
int x,y;
char c;
cin>>x>>y>>c;
fill(x,y,c);
}else{
int x1,x2,y1,y2;
cin>>x1>>y1>>x2>>y2;
line(x1,y1,x2,y2);
}
}
for(int i=n-1;i>=0;i--){
for(int j=0;j<m;j++){
cout<<map[i][j];
}
cout<<endl;
}
return 0;
}
