ccf 201512-3 画图(90)

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  } 

原文地址:https://www.cnblogs.com/yxh-amysear/p/8570000.html