zoukankan      html  css  js  c++  java
  • Mouth 1 模拟题 CSP201512-3 画图

    题目描述:

    思路:

    起初的思路是就建立m宽n高的画布,也就是数组a[n-1][m-1],n行m列,当得到一个点(x,y)时,对应在数组中的坐标应该是 i=n-1-y 和 j=x ,即a[i][j];按照这个映射去直接操作数组,然后顺序输出即可。但是这样只能80分。

    后来怎么也想不明白问题出在哪,就猜测是不是坐标映射和不映射会有不同的结果?然后我就改了代码,就建立a[m-1][n-1]的数组,得到的坐标(x,y)不经过变换,直接操作,最后输出的时候,相当于把整个数组顺时针旋转90°输出(如果把数组看作画布),这样能得100分。

    但是,原来80分有什么问题还不清楚,于是我对拍了两个程序,拍了20分钟左右,没拍出输出不同的数据。直到现在,还没找到问题的原因。

    难道就是玄学?真的很烦

    代码:

    ①80分代码,坐标转换,按序输出,不知道问题在何处

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <queue>
     4 using namespace std;
     5 const int MAXN=105;
     6 char s[MAXN][MAXN]; 
     7 int dx[]={-1,1,0,0};  //上下左右 
     8 int dy[]={0,0,-1,1}; 
     9 int main()
    10 {
    11     int m,n; cin>>m>>n;   //n行m列 
    12     
    13     for(int i=0;i<n;i++)
    14         for(int j=0;j<m;j++)
    15             s[i][j]='.';
    16      
    17     int Q; cin>>Q;
    18     while(Q--)
    19     {
    20         int op,x1,y1,x2,y2;
    21         cin>>op;
    22         if(op==0)    //画线 
    23         {
    24             cin>>x1>>y1>>x2>>y2;
    25             //x表示数组的列,n-1-y表示数组的行 
    26             if(x1==x2)  //画竖线 
    27             {
    28                 for(int i=min(y1,y2),j=max(y1,y2);i<=j;i++)
    29                     if(s[i][x1]=='-') s[i][x1]='+';
    30                     else if(s[i][x1]=='+') continue;
    31                     else s[i][x1]='|'; 
    32             }
    33             else    //画横线 
    34             {
    35                 y1=n-1-y1;
    36                 for(int i=min(x1,x2),j=max(x1,x2);i<=j;i++)
    37                 {
    38                     if(s[y1][i]=='|') s[y1][i]='+';
    39                     else if(s[y1][i]=='+') continue; 
    40                     else s[y1][i]='-';
    41                 }
    42             }
    43         }
    44         else   //填充 
    45         {
    46             cin>>x1>>y1;
    47             char c; cin>>c;
    48             int x=n-1-y1,y=x1;   //
    49             s[x][y]=c;
    50             queue< pair<int,int> > q;
    51             q.push(make_pair(x,y)); 
    52             while(!q.empty())
    53             {
    54                 int sx=q.front().first,
    55                     sy=q.front().second;
    56                 q.pop();
    57                 for(int i=0;i<4;i++)
    58                 {
    59                     int tx=sx+dx[i],
    60                         ty=sy+dy[i];
    61                     if(tx>=0&&tx<=n-1&&ty>=0&&ty<=m-1 && !(s[tx][ty]=='-'||s[tx][ty]=='+'||s[tx][ty]=='|'||s[tx][ty]==c))
    62                     {
    63                         s[tx][ty]=c;
    64                         q.push(make_pair(tx,ty));
    65                     }
    66                 }
    67             } 
    68         }
    69     }
    70     for(int i=0;i<n;i++)
    71     {
    72         for(int j=0;j<m;j++)
    73             printf("%c",s[i][j]);
    74         cout<<endl;
    75     }
    76     return 0; 
    77 }
    View Code

    ②100分代码,坐标不转换,输出特殊处理

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <queue>
     4 using namespace std;
     5 const int MAXN=105;
     6 char s[MAXN][MAXN]; 
     7 int dx[]={-1,1,0,0};  //上下左右 
     8 int dy[]={0,0,-1,1}; 
     9 int main()
    10 {
    11     int m,n; cin>>m>>n;   //m行n列 
    12     
    13     for(int i=0;i<=100;i++)
    14         for(int j=0;j<=100;j++)
    15             s[i][j]='.';
    16      
    17     int Q; cin>>Q;
    18     while(Q--)
    19     {
    20         int op,x1,y1,x2,y2;
    21         cin>>op;
    22         if(op==0)    //画线 
    23         {
    24             cin>>x1>>y1>>x2>>y2;
    25             //x表示数组的列,n-1-y表示数组的行 
    26             if(x1==x2)  //画竖线 
    27             {
    28                 for(int i=min(y1,y2),j=max(y1,y2);i<=j;i++)
    29                     if(s[x1][i]=='-') s[x1][i]='+';
    30                     else if(s[x1][i]=='+') continue;
    31                     else s[x1][i]='|'; 
    32             }
    33             else    //画横线 
    34             {
    35                 for(int i=min(x1,x2),j=max(x1,x2);i<=j;i++)
    36                 {
    37                     if(s[i][y1]=='|') s[i][y1]='+';
    38                     else if(s[i][y1]=='+') continue; 
    39                     else s[i][y1]='-';
    40                 }
    41             }
    42         }
    43         else   //填充 
    44         {
    45             cin>>x1>>y1;
    46             char c; cin>>c;
    47             int x=x1,y=y1;   //
    48             s[x][y]=c;
    49             queue< pair<int,int> > q;
    50             q.push(make_pair(x,y)); 
    51             while(!q.empty())
    52             {
    53                 int sx=q.front().first,
    54                     sy=q.front().second;
    55                 q.pop();
    56                 for(int i=0;i<4;i++)
    57                 {
    58                     int tx=sx+dx[i],
    59                         ty=sy+dy[i];
    60                     if(tx>=0&&tx<=m-1&&ty>=0&&ty<=n-1 && !(s[tx][ty]=='-'||s[tx][ty]=='+'||s[tx][ty]=='|'||s[tx][ty]==c))
    61                     {
    62                         s[tx][ty]=c;
    63                         q.push(make_pair(tx,ty));
    64                     }
    65                 }
    66             } 
    67         }
    68     }
    69 //    把整个画布顺时针旋转90度输出 
    70     for (int i = n-1; i >= 0; --i) 
    71     {
    72         for (int j = 0; j < m; ++j)
    73         {
    74             cout<<s[j][i];
    75         }
    76         cout << endl;
    77     }
    78     return 0; 
    79 }
    View Code

    ③对拍数据

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define random(a,b) ((a)+rand()%((b)-(a)+1))
     4 
     5 stringstream ss;
     6 
     7 int main( int argc, char *argv[] )
     8 { 
     9     int seed=time(NULL);
    10     if(argc)
    11     {
    12         ss.clear();
    13         ss<<argv[1];
    14         ss>>seed;
    15     }
    16     srand(seed);
    17     //以上为随机数初始化,请勿修改
    18     //random(a,b)生成[a,b]的随机整数
    19     
    20     //以下写你自己的数据生成代码 
    21     
    22     int n=random(2,100);
    23     int m=random(2,100);
    24     int q=random(0,100);
    25     printf("%d %d %d
    ",m,n,q);
    26     for(int i=1 ; i<=q ; ++i)
    27     {
    28         int op=random(1,2)-1;
    29         printf("%d ",op);
    30         if(op==0)
    31         {
    32             int hs=random(0,1);
    33             if(hs==0)
    34             {
    35                 //画竖线
    36                 int x=random(0,m-1),
    37                     y1=random(0,n-1),
    38                     y2=random(0,n-1); 
    39                 cout<<x<<' '<<y1<<' '<<x<<' '<<y2;
    40                 cout<<endl;
    41             }
    42             else
    43             {
    44                 int y=random(0,n-1),
    45                     x1=random(0,m-1),
    46                     x2=random(0,m-1); 
    47                 cout<<x1<<' '<<y<<' '<<x2<<' '<<y;
    48                 cout<<endl;
    49             }
    50         }
    51         else
    52         {
    53             char c=random('A','Z');
    54             cout<<random(0,m-1)<<' ' <<random(0,n-1)<<' '<<c<<endl;
    55         }
    56         
    57     }
    58     printf("
    ");
    59     return 0;
    60 }
    View Code
  • 相关阅读:
    SpringBoot:实现定时任务
    Spring Boot: 配置文件详解
    Git 实用技巧:git stash
    nodejs oj在线笔试应对方案(讲几种输入处理方法)
    scrollWidth,offsetWidth,clientWidth,width;scrollHeight,offsetHeight,clientHeight,height;offsetTop,scrollTop,top;offsetLeft,scrollLeft,left还有谁
    CSS3选择器~一看吓一跳,这么多不会
    CSS3伪类和伪元素的特性和区别
    AngularJS1.X学习笔记6-控制器和作用域
    AngularJS1.X学习笔记5-加强版的表单
    AngularJS1.X学习笔记4-内置事件指令及其他
  • 原文地址:https://www.cnblogs.com/qingoba/p/12623524.html
Copyright © 2011-2022 走看看