ccf 201512-3 画图(90)
1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int maxn = 100+5;//最大的行数 ,列数 6 char square[maxn][maxn]; 7 bool visit[maxn][maxn]; 8 int m,n,q;//m为列数,n为行数 9 const int dr[] = {-1,0,1,0};//上,左,下,右 10 const int dc[] = {0,-1,0,1}; 11 bool inside(int x,int y) 12 { 13 return x>=0 && x<n && y>=0 && y<m; 14 } 15 void paintLine() 16 { 17 int x0,y0,x1,y1; 18 cin>>x0>>y0>>x1>>y1; 19 if(y0==y1)//画 - ,需要注意向右为x方向 20 { 21 for(int i=min(x0,x1);i<=max(x0,x1);i++) 22 { 23 if(square[y0][i] == '|') square[y0][i] = '+'; 24 else square[y0][i] = '-'; 25 } 26 } 27 else if(x0 == x1)//画| 。需要注意向左为y方向 28 { 29 for(int i=min(y0,y1);i<=max(y0,y1);i++) 30 { 31 if(square[i][x0] == '-') square[i][x0] = '+'; 32 else square[i][x0] = '|'; 33 } 34 } 35 } 36 37 void paintChar(int x,int y,char c) 38 {///使用dfs 39 if(square[x][y] == '|' || square[x][y] == '-' || square[x][y] == '+') 40 { 41 return; 42 } 43 square[x][y] = c; 44 visit[x][y] = 1; 45 for(int i=0;i<=3;i++) 46 { 47 if(inside(x+dr[i],y+dc[i]) && !visit[x+dr[i]][y+dc[i]]) 48 paintChar(x+dr[i],y+dc[i],c); 49 } 50 } 51 52 int main() 53 { 54 cin>>m>>n>>q; 55 memset(square,'.',sizeof(square)); 56 for(int i=0;i<q;i++) 57 { 58 int type;cin>>type; 59 if(type == 0)//画线 60 paintLine(); 61 else //使用dfs进行填充 62 { 63 memset(visit,0,sizeof(visit)); 64 int x,y;char c; 65 cin>>x>>y>>c; 66 paintChar(y,x,c); 67 } 68 } 69 70 ///进行输出 71 for(int i=n-1;i>=0;i--) 72 { 73 for(int j=0;j<m;j++) 74 cout<<square[i][j]; 75 cout<<endl; 76 } 77 78 return 0; 79 }