Created
July 21, 2016 07:40
-
-
Save anonymous/7737943c9db500b4a041439f63bf42d8 to your computer and use it in GitHub Desktop.
dailyprogrammer 261 easy
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <stdlib.h> | |
int verify(int *square, int side) { | |
int i, j, sum, target; | |
// diagonals | |
target = 0; | |
for (i = 0; i < side; i++) | |
target += square[i*side + i]; | |
sum = 0; | |
for (i = 0; i < side; i++) | |
sum += square[i*side + side-i-1]; | |
if (sum != target) | |
return 0; | |
// horizontals | |
for (i = 0; i < side; i++) { | |
sum = 0; | |
for (j = 0; j < side; j++) | |
sum += square[i*side + j]; | |
if (sum != target) | |
return 0; | |
} | |
// verticals | |
for (i = 0; i < side; i++) { | |
sum = 0; | |
for (j = 0; j < side; j++) | |
sum += square[j*side + i]; | |
if (sum != target) | |
return 0; | |
} | |
return 1; | |
} | |
int can_complete(int *rect, int side) { | |
int i, j, sum, target; | |
// horizontal on row 0 | |
target = 0; | |
for (i = 0; i < side; i++) | |
target += rect[i]; | |
// horizontals from rows 1 upto side-1 (excluding) | |
for (i = 0; i < side-1; i++) { | |
sum = 0; | |
for (j = 0; j < side; j++) | |
sum += rect[i*side + j]; | |
if (sum != target) | |
return 0; | |
} | |
int *last_row = malloc(side * sizeof(int)); | |
int last_row_sum = 0; | |
for (i = 0; i < side; i++) { | |
sum = 0; | |
for (j = 0; j < side-1; j++) | |
sum += rect[j*side + i]; | |
if (target < sum) | |
return 0; | |
last_row[i] = target - sum; | |
last_row_sum += last_row[i]; | |
} | |
if (last_row_sum != target) | |
return 1; | |
// finally, check both diagonals | |
sum = 0; | |
for (i = 0; i < side-1; i++) | |
sum += rect[i*side + side-i-1]; | |
if (sum + last_row[0] != target) | |
return 0; | |
sum = 0; | |
for (i = 0; i < side-1; i++) | |
sum += rect[i*side + i]; | |
return target == (sum + last_row[side-1]); | |
} | |
int main() { | |
int verify_tests[4][9] = {{8, 1, 6, 3, 5, 7, 4, 9, 2}, | |
{2, 7, 6, 9, 5, 1, 4, 3, 8}, | |
{3, 5, 7, 8, 1, 6, 4, 9, 2}, | |
{8, 1, 6, 7, 5, 3, 4, 9, 2}}; | |
int i; | |
for (i = 0; i < 4; i++) | |
printf("%d ", verify(verify_tests[i], 3)); | |
int cc_tests[2][6] = {{8, 1, 6, 3, 5, 7}, | |
{3, 5, 7, 8, 1, 6}}; | |
for (i = 0; i < 2; i++) | |
printf("%d ", can_complete(cc_tests[i], 3)); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment