C語言模擬考|rectangles

Description

Give you N rectangles.If you can pick exactly three pieces of those rectangles to form a larger rectangle?

Input

There are several testcases.

The first line is an integer T, indicating the number of testcases.

For each testcase:

The first line is a integer N and N is no more than 10.

The second line contains 2*N integers describing N rectangles.Each rectangle is described by 2 integers indicating as width and height.

All these integers in the second line are between [1,10000]

Output

If you can do it, print Yes.Otherwise, print No instead.

原版(存在問題):

#include <stdio.h>

int main() {
	int t, i, j, k, p;
	scanf("%d",&t);
	
	for (i = 0; i < t; ++ i) {
		int n;
		scanf("%d",&n);
		int array[2][n];
		
		for (j = 0; j < n; ++ j) {
			scanf("%d%d",&array[0][j],&array[1][j]);
		}
		
		int same[2][n];
		for (j = 0; j < n; ++ j) {
			same[0][j] = 0;
			same[1][j] = 0;
			
			/* Three side by side */
			for (k = 0; k < n; ++ k) {
				if (array[0][k] == array[0][j] || array[1][k] == array[0][j]) {
					same[0][j] += 1;
				}
				if (array[0][k] == array[1][j] || array[1][k] == array[1][j]) {
					same[1][j] += 1;
				}
			}
			
			if (same[0][j] >= 3 || same[1][j] >= 3) {
				printf("Yes\n");
				goto Break;
			}
			
			/* Two side by side */
			if (same[0][j] == 2) {
				for (k = 0; k < n; ++ k) {
					if (k != j && array[0][k] == array[0][j]) {
						for (p = 0; p < n; ++ p) {
							if (p != k && p != j && (array[0][p] == array[1][j] + array[1][k] 
							|| array[1][p] == array[1][j] + array[1][k])) {
								printf("Yes\n");
								goto Break;
							}
						}
					}
					if (k != j && array[1][k] == array[0][j]) {
						for (p = 0; p < n; ++ p) {
							if (p != k && p != j && (array[0][p] == array[0][j] + array[1][k] 
							|| array[1][p] == array[0][j] + array[1][k])) {
								printf("Yes\n");
								goto Break;
							}
						}
					}
				}
			}
			if (same[1][j] == 2) {
				for (k = 0; k < n; ++ k) {
					if (k != j && array[0][k] == array[1][j]) {
						for (p = 0; p < n; ++ p) {
							if (p != k && p != j && (array[0][p] == array[1][j] + array[0][k] 
							|| array[1][p] == array[1][j] + array[0][k])) {
								printf("Yes\n");
								goto Break;
							}
						}
					}
					if (k != j && array[1][k] == array[1][j]) {
						for (p = 0; p < n; ++ p) {
							if (p != k && p != j && (array[0][p] == array[0][j] + array[0][k] 
							|| array[1][p] == array[0][j] + array[0][k])) {
								printf("Yes\n");
								goto Break;
							}
						}
					}
				}
			}
		}
		printf("No\n");
		Break: continue;
	}
}



方法改進後(問題解決):
#include <stdio.h>

int main() {
	int t, i, j, k, p, side1, side2;
	scanf("%d",&t);
	
	for (i = 0; i < t; ++ i) {
		int n;
		scanf("%d",&n);
		int array[2][n];
		
		for (j = 0; j < n; ++ j) {
			scanf("%d%d",&array[0][j],&array[1][j]);
		}
		
		for (j = 0; j < n; ++ j) {
			for (k = 0; k < n; ++ k) {
				if (k == j) continue; 
				if (array[0][k] == array[0][j]) {
					side1 = array[1][k] + array[1][j];
					side2 = array[0][j];
					for (p = 0; p < n; ++ p) {
						if (p == j || p == k) continue;
						if (array[0][p] == side1 || array[0][p] == side2 
						|| array[1][p] == side1 || array[1][p] == side2) {
							printf("Yes\n");
							goto Break;
						}
					} 
				}
				if (array[1][k] == array[0][j]) {
					side1 = array[0][k] + array[1][j];
					side2 = array[0][j];
					for (p = 0; p < n; ++ p) {
						if (p == j || p == k) continue;
						if (array[0][p] == side1 || array[0][p] == side2 
						|| array[1][p] == side1 || array[1][p] == side2) {
							printf("Yes\n");
							goto Break;
						}
					} 
				}
				if (array[0][k] == array[1][j]) {
					side1 = array[1][k] + array[0][j];
					side2 = array[1][j];
					for (p = 0; p < n; ++ p) {
						if (p == j || p == k) continue;
						if (array[0][p] == side1 || array[0][p] == side2 
						|| array[1][p] == side1 || array[1][p] == side2) {
							printf("Yes\n");
							goto Break;
						}
					}
				}
				if (array[1][k] == array[1][j]) {
					side1 = array[0][k] + array[0][j];
					side2 = array[1][j];
					for (p = 0; p < n; ++ p) {
						if (p == j || p == k) continue;
						if (array[0][p] == side1 || array[0][p] == side2 
						|| array[1][p] == side1 || array[1][p] == side2) {
							printf("Yes\n");
							goto Break;
						}
					} 
				}
			}
		}
		printf("No\n");
		Break: continue;
	}
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章