#include <stdio.h> #include <string.h> int X[20001], Y[20001]; //最终答案|X[i]、Y[i]分别 //为ID为i的矩形的x、y坐标 int MAX(int a, int b) { return a > b ? a : b; } struct _ID { union{ //头结点记录数目 int num; //其他结点则记录ID int id; }; _ID* next; }ID[16][16], *pID; //用一个链表把所有尺寸相 //同的歌词串起来 //检测是否所有歌词都放置完毕 bool allAreSeted() { for(int i = 5; i < 16; ++i) for(int j = 5; j < 16; ++j) if(ID[i][j].next) return false; return true; } //一维填充 bool fillLine(int index, int length, int x, int y) { if(!length) return true; for(int j = MAX(length, 15); j > 4; --j) { if(!ID[index][j].next) continue; pID = ID[index][j].next; ID[index][j].next = pID->next; X[pID->id] = x, Y[pID->id] = y; if(fillLine(index, length - j, x, y + j) || allAreSeted()) return true; ID[index][j].next = pID; } return false; } //填充矩形的递归函数 bool fillRect(int w, int h, int x = 0, int y = 0) { if(!w || !h) return fillRect(20, 27); if(w < 16 && fillLine(w, h, x, y)) return true; for(int i = MAX(w, 15), t = MAX(5, i / 2); i >= t; --i) { if(fillRect(i, h, x, y) && fillRect(w - i, h, x + i, y)) return true; } return false; } int main() { int i, j, k; for(i = 5; i < 16; ++i) { for(j = 5; j < 16; ++j) { ID[i][j].next = NULL; ID[i][j].num = 0; } } k = 1; while(scanf("[%d,%d]", &i, &j)) { getchar(); ++ID[i][j].num; pID = new _ID; pID->id = k++; pID->next = ID[i][j].next; ID[i][j].next = pID; } fillRect(20, 27); printf("[%d,%d,1]", X[1], Y[1]); for(i = 2; i < 20001; ++i) { printf(",[%d,%d,%d],", X[i], Y[i], i); } return 0; }