Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- using namespace std;
- struct point{
- int y, x, k;
- };
- const int MAX = 15;
- int t, sum, cnt, a_inx, m = 1, paper[10], map[MAX][MAX], dx[10][MAX], dy[10][MAX];
- bool check[MAX][MAX], flag;
- point arr[120];
- void checkList() {
- for(int k=2;k<6;k++) {
- int inx = 0;
- for(int i=0;i<k;i++) {
- if(i == k-1) {
- for(int j=0;j<=i;j++) {
- dx[k][inx++] = i;
- }
- }
- else dx[k][inx++] = i;
- }
- inx = 0;
- for(int i=k-1;i>=0;i--) {
- if(i == k-1) {
- for(int j=i;j>=0;j--) {
- dy[k][inx++] = i;
- }
- }
- else dy[k][inx++] = i;
- }
- }
- }
- void checkMap(int y, int x, int k) {
- if(k == 0) return;
- int n = 0;
- if(k == 1) n = 1;
- else if(k == 2) n = 3;
- else if(k == 3) n = 5;
- else if(k == 4) n = 7;
- else if(k == 5) n = 9;
- for(int i=0;i<n;i++) {
- int nextX = x + dx[k][i], nextY = y + dy[k][i];
- check[nextY][nextX] = true;
- }
- sum -= n;
- checkMap(y, x, k-1);
- }
- bool checkPaper(int y, int x, int k) {
- int n = 0;
- if(k == 2) n = 3;
- else if(k == 3) n = 5;
- else if(k == 4) n = 7;
- else if(k == 5) n = 9;
- for(int i=0;i<n;i++) {
- int nextX = x + dx[k][i], nextY = y + dy[k][i];
- if(nextX < 0 || nextX > 9 || nextY < 0 || nextY > 9 || map[nextY][nextX] == 0 || check[nextY][nextX]) {
- return false;
- }
- }
- return true;
- }
- int main() {
- checkList();
- for(int i=1;i<=5;i++) paper[i] = 5;
- scanf("%d", &t);
- for(int v=1;v<=t;v++) {
- for(int i=0;i<10;i++) {
- for(int j=0;j<10;j++) {
- scanf("%d", &map[i][j]);
- if(map[i][j] == 1) {
- sum++;
- arr[a_inx].y = i, arr[a_inx].x = j;
- a_inx++;
- }
- }
- }
- for(int i=0;i<a_inx;i++) {
- int k = 2;
- while(1) {
- if(k == 6) {
- arr[i].k = k-1;
- if(m < k-1) m = k-1;
- break;
- }
- if(checkPaper(arr[i].y, arr[i].x, k)) k++;
- else {
- arr[i].k = k-1;
- if(m < k-1) m = k-1;
- break;
- }
- }
- }
- for(int i=m;i>=2;i--) {
- for(int j=0;j<a_inx;j++) {
- if(arr[j].k == i && !check[arr[j].y][arr[j].x]) {
- if(!checkPaper(arr[j].y, arr[j].x, i)) continue;
- else if(paper[i] == 0) continue;
- checkMap(arr[j].y, arr[j].x, i);
- paper[i]--;
- cnt++;
- }
- }
- if(sum == 0) break;
- }
- if(sum != 0) {
- if(sum > paper[1]) sum = 1;
- else {
- cnt += sum;
- sum = 0;
- }
- }
- if(sum != 0) cnt = -1;
- printf("#%d %d\n", v, cnt);
- sum = 0, cnt = 0, flag = false, m = 1, a_inx = 0;
- memset(check, 0, sizeof(check));
- memset(map, 0, sizeof(map));
- memset(arr, 0, sizeof(arr));
- for(int i=1;i<=5;i++) paper[i] = 5;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement