<?xml version="1.0" encoding="UTF-8"?>
|
百练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;
}