#include <stdio.h>
const int kRow = 5;
const int kCol = 5;
const int kNum = 75;
const int kPercentage = 90;
void CreateCard(int card[kRow][kCol]) {
int i, r, c;
int numbers[kNum];
for (i = 0; i < kNum; ++i) {
numbers[i] = i + 1;
}
for (r = 0; r < kRow; ++r) {
for (c = 0; c < kCol; ++c) {
int upper, selected, tmp;
if ((r == kRow / 2) && (c == kCol / 2)) {
card[r][c] = 0;
continue;
}
upper = kNum - (r * kCol + c);
selected = rand() % upper;
card[r][c] = numbers[selected];
tmp = numbers[selected];
numbers[selected] = numbers[upper - 1];
numbers[upper - 1] = tmp;
}
}
}
void PrintCard(int card[kRow][kCol]) {
int r, c;
for (r = 0; r < kRow; ++r) {
for (c = 0; c < kRow; ++c) {
printf("%2d ", card[r][c]);
}
printf("\n");
}
}
void CreateValid(int valid[kRow][kCol], const int percentage) {
int r, c;
for (r = 0; r < kRow; ++r) {
for (c = 0; c < kCol; ++c) {
valid[r][c] = (rand() % 100 + 1) < percentage;
}
}
}
void PrintValid(int valid[kRow][kCol]) {
int r, c;
for (r = 0; r < kRow; ++r) {
for (c = 0; c < kCol; ++c) {
printf("%2d ", valid[r][c]);
}
printf("\n");
}
}
void CalcScore(int card[kRow][kCol],
int valid[kRow][kCol],
int *score,
char *rank) {
int r, c, sum;
*score = 0;
// check row
for (r = 0; r < kRow; ++r) {
sum = 0;
for (c = 0; c < kCol; ++c) {
if (!valid[r][c]) break;
sum += card[r][c];
if (c == kCol - 1) *score += sum;
}
}
// check column
for (c = 0; c < kCol; ++c) {
sum = 0;
for (r = 0; r < kRow; ++r) {
if (!valid[r][c]) break;
sum += card[r][c];
if (r == kRow - 1) *score += sum;
}
}
// check diagon
sum = 0;
for (r = 0; r < kRow; ++r) {
if (!valid[r][r]) break;
sum += card[r][r];
if (r == kRow - 1) *score += sum;
}
sum = 0;
for (r = 0; r < kRow; ++r) {
if (!valid[kRow - r - 1][r]) break;
sum += card[kRow - r - 1][r];
if (r == kRow - 1) *score += sum;
}
if (*score >= 310) {
*rank = 'S';
} else if (*score >= 251) {
*rank = 'A';
} else if (*score >= 192) {
*rank = 'B';
} else if (*score >= 133) {
*rank = 'C';
} else if (*score >= 74) {
*rank = 'D';
} else {
*rank = 'E';
}
}
int main() {
int valid[kRow][kCol];
int card[kRow][kCol];
int score;
char rank;
CreateCard(card);
PrintCard(card);
CreateValid(valid, kPercentage);
PrintValid(valid);
CalcScore(card, valid, &score, &rank);
printf("Score: %d Rank: %c\n", score, rank);
return 0;
}