题目描述:
思路:
起初的思路是就建立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 }
②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 }
③对拍数据
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 }