当前位置:   article > 正文

【蓝桥杯】阿坤老师的魔方挑战

【蓝桥杯】阿坤老师的魔方挑战

目录

1.题目

2.暴力

2.1 代码一

3.正解

3.1 画图分析

3.2 代码二


1.题目

样例输入

  1. 3
  2. 7 8 9
  3. 4 5 7
  4. 1 2 3

样例输出

16

2.暴力

毫无疑问,纯暴力超时了......

2.1 代码一

  1. #include <iostream>
  2. using namespace std;
  3. const int N=250010;
  4. int main()
  5. {
  6. int n,a[N],t[500],temp,maxi=0,sum;
  7. cin>>n;
  8. //输入
  9. for(int i=0;i<n;i++){
  10. temp=n*i;
  11. for(int j=0;j<n;j++)
  12. cin>>a[temp+j];
  13. }
  14. sum=0;
  15. for(int i=0;i<n;i++)
  16. sum+=a[i*n+i];
  17. if(sum>maxi)maxi=sum;
  18. for(int i=0;i<n-1;i++){
  19. //保存第一行
  20. for(int k=0;k<n;k++){
  21. t[k]=a[k];
  22. }
  23. //行循环移动
  24. for(int k=0;k<n;k++){
  25. for(int p=0;p<n-1;p++){
  26. a[p*n+k]=a[(p+1)*n+k];
  27. }
  28. }
  29. //最后一行等于第一行
  30. for(int k=0;k<n;k++)
  31. a[(n-1)*n+k]=t[k];
  32. sum=0;
  33. for(int i=0;i<n;i++)
  34. sum+=a[i*n+i];
  35. if(sum>maxi)maxi=sum;
  36. }
  37. //循环移动,第一行移到最后一行,N*N行移动就只有N种,列移动就N种
  38. for(int i=0;i<n;i++){
  39. //保存第一列
  40. for(int k=0;k<n;k++){
  41. t[k]=a[k*n];
  42. }
  43. //列循环移动
  44. for(int k=0;k<n;k++){
  45. for(int p=0;p<n-1;p++){
  46. a[k*n+p]=a[k*n+p+1];
  47. }
  48. }
  49. //最后一列等于第一列
  50. for(int k=0;k<n;k++)
  51. a[k*n+n-1]=t[k];
  52. //
  53. for(int i=0;i<n-1;i++){
  54. //保存第一行
  55. for(int k=0;k<n;k++){
  56. t[k]=a[k];
  57. }
  58. //行循环移动
  59. for(int k=0;k<n;k++){
  60. for(int p=0;p<n-1;p++){
  61. a[p*n+k]=a[(p+1)*n+k];
  62. }
  63. }
  64. //最后一行等于第一行
  65. for(int k=0;k<n;k++)
  66. a[(n-1)*n+k]=t[k];
  67. sum=0;
  68. for(int i=0;i<n;i++)
  69. sum+=a[i*n+i];
  70. if(sum>maxi)maxi=sum;
  71. }
  72. }
  73. cout<<maxi;
  74. return 0;
  75. }

3.正解

3.1 画图分析

由于是循环行or列,所以很多相对位置是固定的

看了图,有没有豁然开朗呢QvQ

3.2 代码二

这个我觉得是比较好理解的,实在看不懂草稿纸上模拟一下过程吧

  1. #include <iostream>
  2. using namespace std;
  3. const int N=250010;
  4. int main()
  5. {
  6. int n,a[N],maxi=0,sum,temp;
  7. cin>>n;
  8. //输入
  9. for(int i=0;i<n;i++){
  10. temp=n*i;
  11. for(int j=0;j<n;j++)
  12. cin>>a[temp+j];
  13. }
  14. //遍历
  15. for(int l=0;l<n;l++){
  16. sum=0;
  17. for(int r=0;r<n;r++){
  18. int line=(l+r)%n;
  19. int row=r;
  20. sum+=a[line*n+row];
  21. }
  22. if(sum>maxi)maxi=sum;
  23. }
  24. cout<<maxi;
  25. return 0;
  26. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/426117
推荐阅读
相关标签
  

闽ICP备14008679号