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
原文地址:https://www.cnblogs.com/qingoba/p/12623524.html