第三章、枚举!很暴力
第一节、坑爹的奥数
p59 穷举 3位数+3位数=3位数,1~9九个数,只能用一次。
#include <stdio.h> int main() { int a,b,c,d,e,f,g,h,i,total=0; for(a=1; a<=9; a++) for(b=1; b<=9; b++) for(c=1; c<=9; c++) for(d=1; d<=9; d++) for(e=1; e<=9; e++) for(f=1; f<=9; f++) for(g=1; g<=9; g++) for(h=1; h<=9; h++) for(i=1; i<=9; i++) { if(a!=b && a!=c && a!=d && a!=e && a!=f && a!=g && a!=h && a!=i && b!=c && b!=d && b!=e && b!=f && b!=g && b!=h && b!=i && c!=d && c!=e && c!=f && c!=g && c!=h && c!=i && d!=e && d!=f && d!=g && d!=h && d!=i && e!=f && e!=g && e!=h && e!=i && f!=g && f!=h && f!=i && g!=h && g!=i && h!=i && a*100+b*10+c + d*100+e*10+f == g*100+h*10+i) { total++; printf("%d%d%d+%d%d%d=%d%d%d\n",a,b,c,d,e,f,g,h,i); } } printf("total=%d",total/2); getchar(); getchar(); return 0; }
p60 上题,用标记法做
#include <stdio.h> int main() { int a[10], i, total = 0, book[10], sum; for(a[1] = 1; a[1] <= 9; a[1]++) for(a[2] = 1; a[2] <= 9; a[2]++) for(a[3] = 1; a[3] <= 9; a[3]++) for(a[4] = 1; a[4] <= 9; a[4]++) for(a[5] = 1; a[5] <= 9; a[5]++) for(a[6] = 1; a[6] <= 9; a[6]++) for(a[7] = 1; a[7] <= 9; a[7]++) for(a[8] = 1; a[8] <= 9; a[8]++) for(a[9] = 1; a[9] <= 9; a[9]++) { for(i = 1; i <= 9; i++) book[i] = 0; for(i = 1; i <= 9; i++) book[a[i]] = 1; sum = 0; for(i = 1; i <= 9; i++) sum += book[i]; if(sum == 9 && a[1] *100+a[2] *10+a[3] + a[4] *100+a[5] *10+a[6] == a[7] *100+a[8] *10+a[9]) { total++; printf("%d%d%d+%d%d%d=%d%d%d\n", a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9]); } } printf("total=%d", total / 2); getchar(); getchar(); return 0; }
第二节、炸弹人
p64 炸弹人。输出消灭敌人人数最多的那个空地位置的坐标
#include <stdio.h> int main() { char a[20][21]; int i, j, sum, map = 0, p, q, x, y, n, m; scanf("%d %d", &n, &m); for(i = 0; i <= n - 1; i++) scanf("%s", a[i]); for(i = 0; i <= n - 1; i++) { for(j = 0; j <= m - 1; j++) { if(a[i][j] == '.') { sum = 0; //向上统计可以消灭的敌人数 x = i; y = j; while(a[x][y] != '#') { if(a[x][y] == 'G') sum++; x--; } //向下统计可以消灭的敌人数 x = i; y = j; while(a[x][y] != '#') { if(a[x][y] == 'G') sum++; x++; } //向左统计可以消灭的敌人数 x = i; y = j; while(a[x][y] != '#') { if(a[x][y] == 'G') sum++; y--; } //向右统计可以消灭的敌人数 x = i; y = j; while(a[x][y] != '#') { if(a[x][y] == 'G') sum++; y++; } if(sum > map) { map = sum; p = i; q = j; } } } } //printf("将炸弹放置在(%d,%d),最多可以消灭%d个敌人\n", p, q, map); printf("bomp here:(%d,%d),most is:%d\n",p,q,map); getchar(); getchar(); return 0; } /* 13 13 ############# #GG.GGG#GGG.# ###.#G#G#G#G# #.......#..G# #G#.###.#G#G# #GG.GGG.#.GG# #G#.#G#.#.### ##G...G.....# #G#.#G###.#G# #...G#GGG.GG# #G#.#G#G#.#G# #GG.GGG#G.GG# ############# */
第三节、火柴棍等式
p68 火柴棍等式(提高组2008相关)
#include <stdio.h> int fun(int x) { int num=0; int f[10]={6,2,5,5,4,5,6,3,7,6}; //0->9 while(x/10!=0) { num += f[x%10]; x = x/10; } num += f[x]; return num; //返回需要火柴棍的总根数 } int main() { int a,b,c,m,sum=0; scanf("%d",&m); for(a=0;a<=1111;a++) { for(b=0;b<=1111;b++) { c=a+b; if(fun(a)+fun(b)+fun(c)==m-4) { printf("%d+%d=%d\n",a,b,c); sum++; } } } //printf("一共可以拼出%d个不同的等式",sum); printf("The sum is:%d",sum); getchar(); getchar(); return 0; } /* 18 */
第四节、数的全排列
p70 用循环实现3个数的全排列
#include <stdio.h> int main() { int a,b,c; for(a=1;a<=3;a++) for(b=1;b<=3;b++) for(c=1;c<=3;c++) if(a!=b && a!=c && b!=c) printf("%d%d%d\n",a,b,c); getchar(); getchar(); return 0; }
p71 用循环实现4个数的全排列
#include <stdio.h> int main() { int a,b,c,d; for(a=1;a<=4;a++) for(b=1;b<=4;b++) for(c=1;c<=4;c++) for(d=1;d<=4;d++) if(a!=b && a!=c && a!=d && b!=c && b!=d && c!=d) printf("%d%d%d%d\n",a,b,c,d); getchar(); getchar(); return 0; }
oj
以后整理。。。