manually optimized queens
[libfirm] / ir / be / test / queens-handoptimized.c
1 /*
2  * Project:     GCC-firm
3  * File name:   test/Queens.c
4  * Purpose:     solve the queens problem
5  * Author:      Markus Armbruster (in sather-k)
6  * Modified by: Michael Beck (for GCC-firm)
7  * Created:     XX.11.2001
8  * CVS-ID:      $Id$
9  * Copyright:   (c) 2001 Universitaet Karlsruhe
10  * Licence:
11  */
12 /*
13   -- The notorious n-queens problem (C.F. Gauss, 1850)
14   -- Copyright (C) 1996 Markus Armbruster
15 */
16
17 #include <stdlib.h>
18 #include <stdio.h>
19
20
21 typedef int boolean;
22
23 #define true    1
24 #define false   0
25
26 //static int *row;
27 // queen in column c is at row[c]
28
29 static inline int myabs(int i) {
30     if(0 > i)
31         i = -i;
32     return(i);
33 }
34
35 static inline boolean place_ok (int i, const int *r, int ri) {
36     // return whether queen in column i is
37     // not in check from queens left of it
38     int j = 0;
39     boolean res;
40
41     while (j < i) {
42         if ((r[j] == ri) || ((myabs(ri-r[j])) == (i-j))) {
43             res = false;
44             return(res);
45         }
46         j = j+1;
47     }
48
49     res = true;
50     return(res);
51 }
52
53 int solve (int n) {
54     // return the number of solutions to the n-queens problem
55     int c = 0;
56     int res = 0;
57         int *row;
58
59     row = malloc(sizeof(*row) * n);
60     row[0] = -1;
61     while (c >= 0) {
62                 int ri;
63 #if 1
64         do {
65             row[c] = ri = row[c]+1;
66         } while ((ri < n) && (!place_ok(c, row, ri)));
67 #else
68         row[c] = row[c]+1;
69         while ((row[c] < n) && (!place_ok(c, row))) {
70             row[c] = row[c]+1;
71         }
72 #endif
73         if (row[c] < n) { // successfully placed at (c,row[c])
74             if (c == n-1)
75                 res = res+1;
76             else {
77                 c = c+1;
78                 row[c] = -1;
79             }
80         }
81         else // dead end, track back
82             c = c-1;
83     }
84     free(row);
85
86     return(res);
87 }
88
89 static void usage (const char *progname) {
90     printf("usage: %s\n", progname);
91 }
92
93
94 int main (int argc, char *argv[]) {
95     int n;
96
97     switch (argc) {
98     case 1:
99         n = 8;
100         break;
101     case 2:
102         n = atoi(argv[1]);
103         break;
104     default:
105         usage("queens");
106         return 0;
107     }
108     printf("The %d-queens problem has %d solutions.\n", n, solve(n));
109
110     return 0;
111 }