【算法解题报告】棋盘上的距离&校门外的树

<?xml version="1.0" encoding="UTF-8"?>

算法解题报告

by dukeyunz

百练1657 棋盘上的距离

#include

#include  
#include  

int main() 
{
  int nCases, i; 
  scanf("%d", &nCases);
  for(i = 0; i < nCases; i++) 
  { 
    char begin[5], end[5]; 
    scanf("%s %s", begin, end); 
    int x, y; 
    x = abs(begin[0] - end[0]); 
    y = abs(begin[1] - end[1]); 
    if(x == 0 && y == 0) printf("0 0 0 0˙");
    else 
    { 
      if(x < y) printf("%d", y); else printf("%d", x); 
      if(x == y || x == 0 || y == 0) printf(" 1"); else printf(" 2");
      if(x == 0 || y == 0) printf(" 1"); else printf("2");
      if(abs(x-y) % 2 != 0) printf(" Inf˙");
      else if(x == y) printf(" 1"); 
      else printf(" 2˙"); 
    } 
  } 
  return 0;

}

最后的'象'怎么走比较难,如果x-y不是2的倍数,那么象就不能走到目的地,如果是正方形的对角线路线,那么象一步就可以,但如果是长方形的对角线路线,需要先走大正方形,再返回,所以需要两步。

百练2808 校门外的树

#include

int main() 
{ 
  int L, M; 
  int nTrees[10005] = {0}; 
  int start, end; int nCount = 0;
  scanf("%d%d", &L, &M); 
  while (M--) 
  { 
    scanf("%d%d", &start, &end); 
    for (int i = start; i < end; ++i) 
    { 
      nTrees[i] = 1; 
    } 
  }
  for (int i = 0; i < L; ++i) 
  { 
    if (nTrees[i] == 0) 
    { 
      nCount++; 
    } 
  }
  printf("%d˙", nCount); 

  return 0; 

}

以空间换时间的方法。

#include

#include  
#define M_MAX 100 + 2 
struct Area 
{ 
  int start; 
  int end; 
}; 

int CompareArea(const void *elem1, const void *elem2) 
{ 
  return ((Area*)elem1)->start - ((Area*)elem2)->start;
}

int main() 
{ 
  Area area[M_MAX], temp; 
  int L = 0; 
  int M = 0; 
  int count = 0; 
  scanf("%d%d", &L, &M); 
  for (int i = 0; i < M; ++i) 
  { 
    scanf("%d%d", &area[i].start, &area[i].end); 
  } 
  qsort(area, M, sizeof(Area), CompareArea);

  temp = area[0]; 
  for (int i = 1; i < M; ++i) 
  { 
    if (area[i].start <= temp.end) 
    { 
      if (area[i].end > temp.end) 
      { 
        temp.end = area[i].end; 
      } 
    } 
    else 
    { 
      count += temp.end - temp.start + 1; 
      temp = area[i]; 
    } 
  } 

  count += temp.end - temp.start + 1;
  printf("%d˙", L + 1 - count);

  return 0; 

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值