void MaxWell()

我要做一颗伟大的CPU

« ZOJ 3471 Most Powerful放两首歌。 »

ZOJ 3470 Magic Squares

题目大意是说一个机器人在一个星球上迷路了。然后通过扫描方块上的数字来计算出自己所在的方块的周围的方块上的数字。

其实我想说,ZOJ的2月竞赛真TM容易啊。
另外在凌晨4点做已经结束的竞赛题,也真TM蛋疼。

#include <stdio.h>
#include <math.h>
int sq(int x)
{
  return(x*x);
}
void find(int n, int* c, int* mm)
{
  
  int m = sqrt(n-1)/2;
  *mm=m;
  if(n == sq(2*m)+1)
    *c=0;
  else if (n>=sq(2*m)+2 && n<= sq(2*m)+2*m)
    *c=1;
  else if (n==sq(2*m)+2*m+1)
    *c=2;
  else if (n>=sq(2*m)+2*m+2 && n<=sq(2*m+1))
    *c=3;
  else if (n==sq(2*m+1)+1)
    *c=4;
  else if (n>=sq(2*m+1)+2 && n<=sq(2*m+1)+1+2*m)
    *c=5;
  else if (n==sq(2*m+1)+2+2*m)
    *c=6;
  else 
    *c=7;
  return;
}
void showans(int a,int b,int c,int d)
{
  int e[4];
  e[0]=a;
  e[1]=b;
  e[2]=c;
  e[3]=d;
  int i,f;
  do
  {
    f=0;
    for(i=0;i<3;i++)
    {
      if(e[i]>e[i+1])
      {
        f=e[i];
        e[i]=e[i+1];
        e[i+1]=f;
        f=1;
      }
    }
  }
  while(f==1);
  printf("%d %d %d %d\n",e[0],e[1],e[2],e[3]);
}
main()
{
  int t;
  scanf("%d",&t);
  while(t--)
  {
    int n;
    scanf("%d",&n);
    
    if(n==1)
    {
      printf("2 4 6 8\n");
      continue;
    }
    
    /*
    .gggggf
    .x....e
    .a....e
    .a.o..e
    .a....e
    .bccccd
    .......
    将图划分成如上样子。
    x = (2m)^2+1 来找到a  图中m=2
    根据 n 的相对于x和m的位置,将n的位置限定为x~7这8个可能的位置之间
    
    
    case  与m的关系              左侧    右侧    上侧    下侧
    0    x = (2m)^2+1            x + 8m + 5  x - 1    x + 8m + 3  x + 1
    1    a = (2m)^2+2   ~  (2m)^2 + 2m    a + 8m + 5  a - 8m + 3  a - 1    a + 1
    2    b = (2m)^2+2m+1            b + 8m + 5  b + 1     b - 1    b + 8m +7
    3    c = (2m)^2+2m+2  ~  (2m+1)^2    c - 1    c + 1    c - 8m + 1  c + 8m +7
    4    d = (2m+1)^2+1            d - 1    d + 8m + 9  d + 1    d + 8m +7
    5    e = (2m+1)^2+2  ~  (2m+1)^2+1+2m  e - 8m - 1  e + 8m + 9  e + 1    e - 1
    6    f = (2m+1)^2+2+2m          f + 1    f + 8m + 9  f + 8m + 11  f - 1
    7    g = (2m+1)^2+3+2m  ~(2m+2)^2    g + 1    g - 1    g + 8m + 11 g - 1
    
    */
    
    int c,m;
    find(n,&c,&m);
    int l,r,t,b;
    switch(c)
    {
    case 0:
      l=n+8*m+5;  
      r=n-1;
      t=n+8*m+3;
      b=n+1;
      break;
    case 1:
      l=n+8*m+5;
      r=n-8*m+3;
      t=n-1;
      b=n+1;
      break;
    case 2:
      l=n+8*m+5;
      r=n+1;
      t=n-1;
      b=n+8*m+7;
      break;
    case 3:
      l=n-1;
      r=n+1;
      t=n-8*m+1;
      b=n+8*m+7;
      break;
    case 4:
      l=n-1;
      r=n+8*m+9;
      t=n+1;
      b=n+8*m+7;
      break;
    case 5:
      l=n-8*m-1;
      r=n+8*m+9;
      t=n+1;
      b=n-1;
      break;
    case 6:
      l=n+1;
      r=n+8*m+9;
      t=n+8*m+11;
      b=n-1;
      break;
    case 7:
      l=n+1;
      r=n-1;
      t=n+8*m+11;
      b=n-8*m-3;
      break;
    }
    showans(l,r,t,b);
  }
}

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Search

网站分类

最近发表

最新评论及回复

文章归档

Powered By Z-Blog 1.8 Walle Build 100427 Designed by Han'space

Copyright BAROKKU. All Rights Reserved.
沪ICP备10025625号