cses

cses solutions in pure c
git clone git://git.superpozycja.net/cses
log | files | refs

s.c (916B)


      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <string.h>
      4 #include <stdint.h>
      5 
      6 uint8_t state[8][8];
      7 uint8_t b[8][8];
      8 uint64_t res;
      9 
     10 void backtrack(int n)
     11 {
     12 	int i;
     13 	int j;
     14 
     15 	if (n == 8) {
     16 		res++;
     17 		return;
     18 	}
     19 
     20 	for (i = 0; i < 8; i++) {
     21 		if (state[n][i] || b[n][i])
     22 			continue;
     23 
     24 		for (j = n; j < 8; j++)
     25 			state[j][i]++;
     26 
     27 		for (j = 0; i + j < 8 && n + j < 8; j++)
     28 			state[n+j][i+j]++;
     29 
     30 		for (j = 0; i - j >= 0 && n + j < 8; j++)
     31 			state[n+j][i-j]++;
     32 
     33 		backtrack(n + 1);
     34 
     35 		for (j = n; j < 8; j++)
     36 			state[j][i]--;
     37 
     38 		for (j = 0; i + j < 8 && n + j < 8; j++)
     39 			state[n+j][i+j]--;
     40 
     41 		for (j = 0; i - j >= 0 && n + j < 8; j++)
     42 			state[n+j][i-j]--;
     43 
     44 	}
     45 }
     46 
     47 int solve()
     48 {
     49 	int i;
     50 	int j;
     51 
     52 	for (i = 0; i < 8; i++) {
     53 		for (j = 0; j < 8; j++)
     54 			if (getchar() == '*')
     55 				b[i][j] = 1;
     56 
     57 		getchar();
     58 	}
     59 
     60 	backtrack(0);
     61 
     62 	printf("%llu\n", res);
     63 
     64 	return 0;
     65 }
     66 
     67 int main()
     68 {
     69 	int t = 1;
     70 	while (t--)
     71 		solve();
     72 }