csp20151203画图 解题报告和易错地方

Solution:

dfs

对于dfs:

    //遇到map[u][v]==c,则不用再搜
    //因为通过(u,v)到达的其它点(p,q),
    //之前从(u,v)开始肯定能到达(p,q),(p,q)已经被填充了

注意:

                    if (map[x1][i]=='-' || map[x1][i]=='+')
                        map[x1][i]='+';
                    else
                        map[x1][i]='|';

不要写成了

                    if (map[x1][i]=='-')
                        map[x1][i]='+';
                    else
                        map[x1][i]='|';

如果原来是‘+’,加了一竖仍是’|'

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #define maxm 102
  4 #define maxn 102
  5 
  6 char map[maxm][maxn],c;
  7 long m,n;
  8 
  9 void dfs(long x,long y)
 10 {
 11     //遇到map[u][v]==c,则不用再搜
 12     //因为通过(u,v)到达的其它点(p,q),
 13     //之前从(u,v)开始肯定能到达(p,q),(p,q)已经被填充了
 14     map[x][y]=c;
 15     if (x!=0 && map[x-1][y]!=c && map[x-1][y]!='|'
 16         && map[x-1][y]!='-' && map[x-1][y]!='+')
 17         dfs(x-1,y);
 18 
 19     if (x!=m-1 && map[x+1][y]!=c && map[x+1][y]!='|'
 20         && map[x+1][y]!='-' && map[x+1][y]!='+')
 21         dfs(x+1,y);
 22 
 23     if (y!=0 && map[x][y-1]!=c && map[x][y-1]!='|'
 24         && map[x][y-1]!='-' && map[x][y-1]!='+')
 25         dfs(x,y-1);
 26 
 27     if (y!=n-1 && map[x][y+1]!=c && map[x][y+1]!='|'
 28         && map[x][y+1]!='-' && map[x][y+1]!='+')
 29         dfs(x,y+1);
 30 }
 31 
 32 int main()
 33 {
 34     long x1,y1,x2,y2,x,y,q,l,i,j,mode,temp;
 35     scanf("%ld%ld%ld",&m,&n,&q);
 36     for (i=0;i<m;i++)
 37         for (j=0;j<n;j++)
 38             map[i][j]='.';
 39     for (l=1;l<=q;l++)
 40     {
 41         scanf("%ld",&mode);
 42         if (mode==0)
 43         {
 44             scanf("%ld%ld%ld%ld",&x1,&y1,&x2,&y2);
 45             if (x1==x2)
 46             {
 47                 if (y1>y2)
 48                 {
 49                     temp=y1;
 50                     y1=y2;
 51                     y2=temp;
 52                 }
 53                 for (i=y1;i<=y2;i++)
 54                     if (map[x1][i]=='-' || map[x1][i]=='+')
 55                         map[x1][i]='+';
 56                     else
 57                         map[x1][i]='|';
 58             }
 59             else
 60             {
 61                 if (x1>x2)
 62                 {
 63                     temp=x1;
 64                     x1=x2;
 65                     x2=temp;
 66                 }
 67                 for (i=x1;i<=x2;i++)
 68                     if (map[i][y1]=='|' || map[i][y1]=='+')
 69                         map[i][y1]='+';
 70                     else
 71                         map[i][y1]='-';
 72             }
 73         }
 74         else
 75         {
 76             scanf("%ld %ld %c",&x,&y,&c);
 77             //从(x,y)开始能到达的点
 78             dfs(x,y);
 79         }
 80     }
 81     for (i=n-1;i>=0;i--)
 82     {
 83         for (j=0;j<m;j++)
 84             printf("%c",map[j][i]);
 85         printf("
");
 86     }
 87     return 0;
 88 }
 89 /*
 90 16 13 9
 91 0 3 1 12 1
 92 0 12 1 12 10
 93 0 12 10 3 10
 94 0 3 10 3 1
 95 0 5 6 10 6
 96 0 10 6 10 8
 97 0 10 8 5 8
 98 0 5 8 5 6
 99 1 5 4 A
100 */

拓展:
矩形填充颜色

1.
x,y范围很大,如0~10000000
Solution:离散化

2.
很多组数据,如100000000组数据,但但x,y范围较小
逆推,一个位置的值为最后一个填充的值

原文地址:https://www.cnblogs.com/cmyg/p/6704845.html