Posted on 2010-10-18 17:05
李東亮 閱讀(146)
評論(0) 編輯 收藏 引用 所屬分類:
acm
ZOJ 1178 Booklet Printing
這道題是一道簡單的模擬題,但是做起來有點繁瑣,不僅處理過程繁瑣,輸出也繁瑣。這個問題大意是打印文章,雙面打印,一面打印兩頁,給定頁數,然后輸出每頁紙打印的頁碼。要求這些紙放在一起,從中間折疊后,頁碼連續遞增。找兩張紙一試就知道怎么回事了。用front[0]、front[1]分別表示正面打印的頁碼數,back[0]、back[1]表示背面打印的頁碼數。對于4頁的文章,毫無疑問front[1]
= 1;back[0]=2;back[1]=3;front[0]=4。在輸出的時候back與冒號之間有空格,而front與冒號之間無空格,開始還以為是題目打錯了,自作聰明的該了下,提交就WA了,后來改過來一看,原來是多打個空格是因為front比back多個字母,為了對齊好看。需要注意的是首頁或者最后一頁有可能有空白頁,需要額外處理。
參考代碼如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node
{
int front[2];
int back[2];
}a[25];
int main(void)
{
int n;
int i;
int pages;
int t;
while (scanf("%d", &n) != EOF && n != 0)
{
pages = n/4;
if (n%4 != 0)
++pages;
t = 0;
memset(a, 0, sizeof(a));
for (i = 0; i < pages-1; ++i)
{
++t;
a[i].front[1] = t;
++t;
a[i].back[0] = t;
}
if (n > t)
{
++t;
a[i].front[1] = t;
}
if (n > t)
{
++t;
a[i].back[0] = t;
}
i = pages - 1;
while (n > t+1)
{
++t;
a[i].back[1] = t;
++t;
a[i].front[0] = t;
--i;
}
if (n > t)
{
++t;
a[i].back[1] = t;
}
if (n > t)
{
++t;
a[i].front[0] = t;
}
printf("Printing order for %d pages:\n", n);
for (i = 0; i < pages-1; ++i)
{
printf("Sheet %d, front: ", i+1);
if (a[i].front[0] == 0)
{
printf("%s, ", "Blank");
}
else
{
printf("%d, ", a[i].front[0]);
}
if (a[i].front[1] == 0)
{
printf("%s\n", "Blank");
}
else
{
printf("%d\n", a[i].front[1]);
}
printf("Sheet %d, back : ", i+1);
if (a[i].back[0] == 0)
{
printf("%s, ", "Blank");
}
else
{
printf("%d, ", a[i].back[0]);
}
if (a[i].back[1] == 0)
{
printf("%s\n", "Blank");
}
else
{
printf("%d\n", a[i].back[1]);
}
}
if (a[i].front[0] != 0 || a[i].front[1] != 0)
{
printf("Sheet %d, front: ", i+1);
if (a[i].front[0] == 0)
{
printf("%s, ", "Blank");
}
else
{
printf("%d, ", a[i].front[0]);
}
if (a[i].front[1] == 0)
{
printf("%s\n", "Blank");
}
else
{
printf("%d\n", a[i].front[1]);
}
}
if (a[i].back[0] != 0 || a[i].back[1] != 0)
{
printf("Sheet %d, back : ", i+1);
if (a[i].back[0] == 0)
{
printf("%s, ", "Blank");
}
else
{
printf("%d, ", a[i].back[0]);
}
if (a[i].back[1] == 0)
{
printf("%s\n", "Blank");
}
else
{
printf("%d\n", a[i].back[1]);
}
}
}
return 0;
}