1
- /*
2
- * provide timing and utility functions.
3
- *
4
- * identifiers starting with bm_ are reserved
5
- */
1
+ /* puzzle benchmark */
6
2
7
3
#include <stdbool.h>
8
4
#include <stdint.h>
9
5
#include <stdio.h>
10
6
11
- /* return the last result of TIME_CYCLES. */
12
- #define GET_CYCLES 1 /* bm_get_cycles () */
7
+ #define SIZE 511
8
+ #define CLASS_MAX 3
9
+ #define TYPE_MAX 12
13
10
14
- /* output the result of type double, higher is better. Never returns. */
15
- #define RESULT (val ) bm_set_result(val)
11
+ static char piececount [CLASS_MAX + 1 ];
12
+ static uint8_t class [TYPE_MAX + 1 ];
13
+ static short piecemax [TYPE_MAX + 1 ];
14
+ static bool puzzle [SIZE + 1 ];
15
+ static bool p [TYPE_MAX + 1 ][SIZE + 1 ];
16
16
17
- /* output an error and kill the program. Never returns. */
18
- #define ERROR (msg ) bm_error(msg)
19
-
20
- /* make sure this value is calculated and not optimized away. */
21
- #define USE (value ) bm_eat((int) (value))
22
-
23
- /* return a zero without the compiler knowing it. */
24
- #define ZERO bm_return_zero()
25
-
26
- /* tag the next result with the given string. */
27
- #define TAG (s ) bm_set_tag(s)
28
-
29
- #define TIME_CYCLES
30
-
31
- static int bm_return_zero (void )
32
- {
33
- return 0 ;
34
- }
35
- static void bm_eat (int val ) {}
36
- static void bm_set_tag (const char * tag )
37
- {
38
- printf ("TAG %s\n" , tag );
39
- }
40
- static void bm_error (char * msg )
41
- {
42
- printf ("ERROR %s\n" , msg );
43
- }
44
- static void bm_set_result (float val )
45
- {
46
- ;
47
- }
48
- static void bm_get_cycles ()
49
- {
50
- ;
51
- }
52
-
53
- /*
54
- * declares the main function for you, use it like this:
55
- * BEGIN_MAIN
56
- * code;
57
- * more code;
58
- * END_MAIN
59
- */
60
- #define BEGIN_MAIN \
61
- int main(int argc, char **argv) \
62
- {
63
- #define END_MAIN \
64
- return 0; \
65
- }
66
-
67
- /*
68
- * can be used instead of coding your own main(), if you
69
- * only have a single, simple test
70
- */
71
- #define SINGLE_BENCHMARK (code ) \
72
- BEGIN_MAIN \
73
- code; \
74
- END_MAIN
75
-
76
- #define size 511
77
- #define classmax 3
78
- #define typemax 12
79
- #define d 8
80
-
81
- /*
82
- * The standard puzzle benchmark
83
- */
84
-
85
- char piececount [classmax + 1 ];
86
- char class [typemax + 1 ];
87
- short piecemax [typemax + 1 ];
88
- char puzzle [size + 1 ];
89
- char p [typemax + 1 ][size + 1 ];
90
-
91
- short m , n ;
92
- int kount ;
17
+ static short m , n ;
18
+ static int kount ;
93
19
94
20
int fit (int i , int j )
95
21
{
96
- short k ;
22
+ for (short k = 0 ; k <= piecemax [i ]; k ++ ) {
23
+ if (p [i ][k ] && puzzle [j + k ])
24
+ return false;
25
+ }
97
26
98
- for (k = 0 ; k <= piecemax [i ]; k ++ )
99
- if (p [i ][k ])
100
- if (puzzle [j + k ])
101
- return false;
102
27
return true;
103
28
}
104
29
105
30
int place (int i , int j )
106
31
{
107
- short k ;
108
- for (k = 0 ; k <= piecemax [i ]; k ++ )
32
+ for (short k = 0 ; k <= piecemax [i ]; k ++ ) {
109
33
if (p [i ][k ])
110
34
puzzle [j + k ] = true;
35
+ }
111
36
piececount [class [i ]] = piececount [class [i ]] - 1 ;
112
- for (k = j ; k <= size ; k ++ )
37
+ for (short k = j ; k <= SIZE ; k ++ ) {
113
38
if (!puzzle [k ])
114
39
return k ;
40
+ }
115
41
116
42
return false;
117
43
}
118
44
119
45
void remove_ (int i , int j )
120
46
{
121
- for (short k = 0 ; k <= piecemax [i ]; k ++ )
47
+ for (short k = 0 ; k <= piecemax [i ]; k ++ ) {
122
48
if (p [i ][k ])
123
49
puzzle [j + k ] = false;
50
+ }
124
51
piececount [class [i ]] = piececount [class [i ]] + 1 ;
125
52
}
126
53
127
54
int trial (int j )
128
55
{
129
- int i , k ;
130
- char trialval ;
131
-
132
- for (i = 0 ; i <= typemax ; i ++ ) {
133
- if (piececount [class [i ]])
134
- if (fit (i , j )) {
135
- k = place (i , j );
136
- if (trial (k ) || (k == 0 )) {
137
- /*printf("piece %d at %d\n", i + 1, k + 1);*/ ;
138
- kount = kount + 1 ;
139
- return (true);
140
- } else
141
- remove_ (i , j );
56
+ for (int i = 0 ; i <= TYPE_MAX ; i ++ ) {
57
+ if (piececount [class [i ]] && fit (i , j )) {
58
+ int k = place (i , j );
59
+ if (trial (k ) || (k == 0 )) {
60
+ kount ++ ;
61
+ return true;
142
62
}
63
+ remove_ (i , j );
64
+ }
143
65
}
144
- kount = kount + 1 ;
145
- return (false);
66
+
67
+ kount ++ ;
68
+ return false;
146
69
}
147
70
148
- void puzzle_ (void )
71
+ void run_puzzle (void )
149
72
{
150
73
int i , j , k ;
151
74
152
- for (m = 0 ; m <= size ; m ++ )
75
+ for (m = 0 ; m <= SIZE ; m ++ )
153
76
puzzle [m ] = 1 ;
154
- for (i = 1 ; i <= 5 ; i ++ )
77
+
78
+ for (i = 1 ; i <= 5 ; i ++ ) {
155
79
for (j = 1 ; j <= 5 ; j ++ )
156
80
for (k = 1 ; k <= 5 ; k ++ )
157
81
puzzle [i + 8 * (j + 8 * k )] = 0 ;
158
- for (i = 0 ; i <= 12 ; i ++ )
82
+ }
83
+ for (i = 0 ; i <= 12 ; i ++ ) {
159
84
for (m = 0 ; m <= 511 ; m ++ )
160
- p [i ][m ] = 0 ;
161
- for (i = 0 ; i <= 3 ; i ++ )
85
+ p [i ][m ] = false;
86
+ }
87
+ for (i = 0 ; i <= 3 ; i ++ ) {
162
88
for (j = 0 ; j <= 1 ; j ++ )
163
89
for (k = 0 ; k <= 0 ; k ++ )
164
- p [0 ][i + 8 * (j + 8 * k )] = 1 ;
90
+ p [0 ][i + 8 * (j + 8 * k )] = true;
91
+ }
92
+
165
93
class [0 ] = 0 ;
166
94
piecemax [0 ] = 3 + 8 * 1 + 8 * 8 * 0 ;
167
- for (i = 0 ; i <= 1 ; i ++ )
95
+ for (i = 0 ; i <= 1 ; i ++ ) {
168
96
for (j = 0 ; j <= 0 ; j ++ )
169
97
for (k = 0 ; k <= 3 ; k ++ )
170
- p [1 ][i + 8 * (j + 8 * k )] = 1 ;
98
+ p [1 ][i + 8 * (j + 8 * k )] = true;
99
+ }
100
+
171
101
class [1 ] = 0 ;
172
102
piecemax [1 ] = 1 + 8 * 0 + 8 * 8 * 3 ;
173
- for (i = 0 ; i <= 0 ; i ++ )
103
+ for (i = 0 ; i <= 0 ; i ++ ) {
174
104
for (j = 0 ; j <= 3 ; j ++ )
175
105
for (k = 0 ; k <= 1 ; k ++ )
176
- p [2 ][i + 8 * (j + 8 * k )] = 1 ;
106
+ p [2 ][i + 8 * (j + 8 * k )] = true;
107
+ }
108
+
177
109
class [2 ] = 0 ;
178
110
piecemax [2 ] = 0 + 8 * 3 + 8 * 8 * 1 ;
179
- for (i = 0 ; i <= 1 ; i ++ )
111
+ for (i = 0 ; i <= 1 ; i ++ ) {
180
112
for (j = 0 ; j <= 3 ; j ++ )
181
113
for (k = 0 ; k <= 0 ; k ++ )
182
- p [3 ][i + 8 * (j + 8 * k )] = 1 ;
114
+ p [3 ][i + 8 * (j + 8 * k )] = true;
115
+ }
116
+
183
117
class [3 ] = 0 ;
184
118
piecemax [3 ] = 1 + 8 * 3 + 8 * 8 * 0 ;
185
- for (i = 0 ; i <= 3 ; i ++ )
119
+ for (i = 0 ; i <= 3 ; i ++ ) {
186
120
for (j = 0 ; j <= 0 ; j ++ )
187
121
for (k = 0 ; k <= 1 ; k ++ )
188
- p [4 ][i + 8 * (j + 8 * k )] = 1 ;
122
+ p [4 ][i + 8 * (j + 8 * k )] = true;
123
+ }
124
+
189
125
class [4 ] = 0 ;
190
126
piecemax [4 ] = 3 + 8 * 0 + 8 * 8 * 1 ;
191
- for (i = 0 ; i <= 0 ; i ++ )
127
+ for (i = 0 ; i <= 0 ; i ++ ) {
192
128
for (j = 0 ; j <= 1 ; j ++ )
193
129
for (k = 0 ; k <= 3 ; k ++ )
194
- p [5 ][i + 8 * (j + 8 * k )] = 1 ;
130
+ p [5 ][i + 8 * (j + 8 * k )] = true;
131
+ }
132
+
195
133
class [5 ] = 0 ;
196
134
piecemax [5 ] = 0 + 8 * 1 + 8 * 8 * 3 ;
197
- for (i = 0 ; i <= 2 ; i ++ )
135
+ for (i = 0 ; i <= 2 ; i ++ ) {
198
136
for (j = 0 ; j <= 0 ; j ++ )
199
137
for (k = 0 ; k <= 0 ; k ++ )
200
- p [6 ][i + 8 * (j + 8 * k )] = 1 ;
138
+ p [6 ][i + 8 * (j + 8 * k )] = true;
139
+ }
140
+
201
141
class [6 ] = 1 ;
202
142
piecemax [6 ] = 2 + 8 * 0 + 8 * 8 * 0 ;
203
- for (i = 0 ; i <= 0 ; i ++ )
143
+ for (i = 0 ; i <= 0 ; i ++ ) {
204
144
for (j = 0 ; j <= 2 ; j ++ )
205
145
for (k = 0 ; k <= 0 ; k ++ )
206
- p [7 ][i + 8 * (j + 8 * k )] = 1 ;
146
+ p [7 ][i + 8 * (j + 8 * k )] = true;
147
+ }
148
+
207
149
class [7 ] = 1 ;
208
150
piecemax [7 ] = 0 + 8 * 2 + 8 * 8 * 0 ;
209
- for (i = 0 ; i <= 0 ; i ++ )
151
+ for (i = 0 ; i <= 0 ; i ++ ) {
210
152
for (j = 0 ; j <= 0 ; j ++ )
211
153
for (k = 0 ; k <= 2 ; k ++ )
212
- p [8 ][i + 8 * (j + 8 * k )] = 1 ;
154
+ p [8 ][i + 8 * (j + 8 * k )] = true;
155
+ }
156
+
213
157
class [8 ] = 1 ;
214
158
piecemax [8 ] = 0 + 8 * 0 + 8 * 8 * 2 ;
215
- for (i = 0 ; i <= 1 ; i ++ )
159
+ for (i = 0 ; i <= 1 ; i ++ ) {
216
160
for (j = 0 ; j <= 1 ; j ++ )
217
161
for (k = 0 ; k <= 0 ; k ++ )
218
- p [9 ][i + 8 * (j + 8 * k )] = 1 ;
162
+ p [9 ][i + 8 * (j + 8 * k )] = true;
163
+ }
164
+
219
165
class [9 ] = 2 ;
220
166
piecemax [9 ] = 1 + 8 * 1 + 8 * 8 * 0 ;
221
- for (i = 0 ; i <= 1 ; i ++ )
167
+ for (i = 0 ; i <= 1 ; i ++ ) {
222
168
for (j = 0 ; j <= 0 ; j ++ )
223
169
for (k = 0 ; k <= 1 ; k ++ )
224
- p [10 ][i + 8 * (j + 8 * k )] = 1 ;
170
+ p [10 ][i + 8 * (j + 8 * k )] = true;
171
+ }
172
+
225
173
class [10 ] = 2 ;
226
174
piecemax [10 ] = 1 + 8 * 0 + 8 * 8 * 1 ;
227
- for (i = 0 ; i <= 0 ; i ++ )
175
+ for (i = 0 ; i <= 0 ; i ++ ) {
228
176
for (j = 0 ; j <= 1 ; j ++ )
229
177
for (k = 0 ; k <= 1 ; k ++ )
230
- p [11 ][i + 8 * (j + 8 * k )] = 1 ;
178
+ p [11 ][i + 8 * (j + 8 * k )] = true;
179
+ }
180
+
231
181
class [11 ] = 2 ;
232
182
piecemax [11 ] = 0 + 8 * 1 + 8 * 8 * 1 ;
233
- for (i = 0 ; i <= 1 ; i ++ )
183
+ for (i = 0 ; i <= 1 ; i ++ ) {
234
184
for (j = 0 ; j <= 1 ; j ++ )
235
185
for (k = 0 ; k <= 1 ; k ++ )
236
- p [12 ][i + 8 * (j + 8 * k )] = 1 ;
186
+ p [12 ][i + 8 * (j + 8 * k )] = true;
187
+ }
188
+
237
189
class [12 ] = 3 ;
238
190
piecemax [12 ] = 1 + 8 * 1 + 8 * 8 * 1 ;
239
191
piececount [0 ] = 13 ;
240
192
piececount [1 ] = 3 ;
241
193
piececount [2 ] = 1 ;
242
194
piececount [3 ] = 1 ;
195
+
243
196
m = 1 + 8 * (1 + 8 * 1 );
244
197
kount = 0 ;
245
- if (fit (0 , m ))
198
+
199
+ if (fit (0 , m )) {
246
200
n = place (0 , m );
247
- else {
201
+ } else {
248
202
printf ("error 1\n" );
249
203
}
250
204
if (trial (n )) {
@@ -254,4 +208,8 @@ void puzzle_(void)
254
208
}
255
209
}
256
210
257
- SINGLE_BENCHMARK (puzzle_ ())
211
+ int main (int argc , char * * argv )
212
+ {
213
+ run_puzzle ();
214
+ return 0 ;
215
+ }
0 commit comments