将1、2、3、4、5和6 填入下表中,要使得每一列右边的数字比左边的数字大,每一行下面的数字比上面的数字大。按此要求,可有几种填写方法?
*问题分析与算法设计
按题目的要求进行分析,数字1一定是放在第一行第一列的格中,数字6一定是放在第二行第三列的格中。在实现时可用一个一维数组表示,前三个元素表示第一行,后三个元素表示第二行。先根据原题初始化数组,再根据题目中填 写数字的要求进行试探。
1 #include <stdio.h>
2
3 int a[9]={0};
4 int ok(int, int *);
5 int main()
6 {
7 int m, count = 0;
8 for (m = 123; m <= 333; m++ )
9 {
10 if (ok(m, a) && ok(2*m, a + 3) && (3*m, a + 6))
11 {
12 printf("No.%d: %d %d %d\n", ++count, m, 2*m, 3*m);
13 }
14 }
15
16 return 0;
17 }
18
19 int ok(int t, int *z)
20 {
21 int *p1 = NULL,*p2 = NULL;
22 for (p1 = z; p1 < z + 3; p1++)
23 {
24 *p1 = t%10;
25 t /= 10;
26 for (p2 = a; p2 < p1; p2++)
27 {
28 if (0 == *p1 || *p1 == *p2)
29 {
30 return 0;
31 }
32 }
33 }
34 return 1;
35 }
[root@localhost 59]# ./a.out
No.1: 134 268 402No.2: 138 276 414
No.3: 139 278 417
No.4: 143 286 429
No.5: 148 296 444
No.6: 164 328 492
No.7: 176 352 528
No.8: 178 356 534
No.9: 179 358 537
No.10: 182 364 546
No.11: 186 372 558
No.12: 192 384 576
No.13: 218 436 654
No.14: 219 438 657
No.15: 238 476 714
No.16: 239 478 717
No.17: 267 534 801
No.18: 269 538 807
No.19: 273 546 819
No.20: 293 586 879
No.21: 314 628 942
No.22: 327 654 981
No.23: 329 658 987