[关闭]
@zzzc18 2017-09-25T18:03:51.000000Z 字数 1307 阅读 1344

Code-Festival-2017-qualA_____D - Four Coloring

AtCoder


题目:

image_1bqs6ke9s3inecp16dfebo1aunm.png-65.5kB
输入
输出矩阵的最终颜色

Solution:

image_1bqs6h88nglj7ihfp86s71jr19.png-94.5kB
image_1bqs6o92ar34s1s1g81pig7jm13.png-160.6kB

这里的关键是曼哈顿距离的矩阵旋转 后再将距离乘 就得到了一个新的矩阵,其点与点之间的距离为切比雪夫距离

Proof:

旋转 后得到点
设点 原先的极角为
由:

得:

时 结果显然


我的代码里 直接表示一个点的坐标处放的颜色,而不直接是答案

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<cmath>
  5. using namespace std;
  6. const int MAXN = 1009;
  7. int n,m,d;
  8. int mat[MAXN][MAXN];
  9. int ans[MAXN][MAXN];
  10. int ADD;
  11. int cal(int x,int y){
  12. if(x%2==1){
  13. if(y%2==1)
  14. return 1;
  15. else
  16. return 2;
  17. }
  18. else{
  19. if(y%2==1)
  20. return 3;
  21. else
  22. return 4;
  23. }
  24. }
  25. int locx(int x,int y){
  26. if((x+y-1)%d==0){
  27. return (x+y-1)/d;
  28. }
  29. else
  30. return (x+y-1)/d+1;
  31. }
  32. int locy(int x,int y){
  33. if((y-x+m)%d==0)
  34. return (y-x+m)/d;
  35. else
  36. return (y-x+m)/d+1;
  37. }
  38. void COLOR(){
  39. int i,j;
  40. for(i=1;i<=(n+m)/d+1;i++){
  41. for(j=1;j<=(n+m)/d+1;j++){
  42. mat[i][j]=cal(i,j);
  43. }
  44. }
  45. }
  46. void REMAP(){
  47. int i,j;
  48. for(i=1;i<=m;i++){
  49. for(j=1;j<=n;j++){
  50. ans[i][j]=mat[locx(i,j)][locy(i,j)];
  51. }
  52. }
  53. }
  54. char GETCHAR(int x){
  55. if(x==1)return 'R';
  56. if(x==2)return 'G';
  57. if(x==3)return 'Y';
  58. if(x==4)return 'B';
  59. }
  60. void OUT(){
  61. int i,j;
  62. for(i=1;i<=n;i++){
  63. for(j=1;j<=m;j++){
  64. printf("%c",GETCHAR(ans[j][i]));
  65. }
  66. puts("");
  67. }
  68. }
  69. void solve(){
  70. COLOR();
  71. REMAP();
  72. OUT();
  73. }
  74. int main(){
  75. scanf("%d%d%d",&n,&m,&d);
  76. solve();
  77. return 0;
  78. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注