#include <klee/klee.h>
#define N 3
unsigned char square[N * N];
unsigned int line(int i, int j) { return i * N + j; }
unsigned int col(int i, int j) { return i + j * N; }
unsigned int sum_line_col(unsigned int (*f)(int i, int j))
{
int i, j;
unsigned int sum, csum;
for (i = 0; i < N; i++) {
csum = 0;
for (j = 0; j < N; j++) {
csum += square[ f(i, j) ];
}
if (0 == i) {
sum = csum;
}
if (sum != csum) {
return 0;
}
}
return csum;
}
unsigned int sum_diag()
{
int i;
unsigned int main_sum = 0, sec_sum = 0;
for (i = 0; i < N; i++) {
main_sum += square[ line(i, i) ];
}
unsigned int sum = 0;
for (i = 0; i < N; i++) {
sec_sum += square[ line(i, i) ];
}
if (main_sum != sec_sum) {
return 0;
}
return main_sum;
}
int each_once()
{
unsigned char all_nums[N * N] = { 0 };
int i, j;
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
unsigned cell = square[ line(i, j) ];
if (cell > N * N || cell < 1) {
return 0;
}
all_nums[cell - 1]++;
}
}
for(i = 0; i < N * N; i++) {
if (all_nums[i] > 1) {
return 0;
}
}
return 1;
}
int magic()
{
unsigned int s_line = sum_line_col(&line);
unsigned int s_col = sum_line_col(&col);
unsigned int s_diag = sum_diag();
if (each_once() && s_line == s_col && s_col == s_diag) {
return 1;
}
return 0;
}
int main(int argc, char *argv[])
{
klee_make_symbolic(&square[0], sizeof(unsigned char) * N * N, "square");
klee_assert(!magic());
return 0;
}
Comments
0 B
|0 👍
/0 👎
0 B
|👍
/👎