目录:
一、求八皇后有多少种解法(穷举法)
二、组合硬币问题(穷举法)
三、求二进制中有多少个1(位运算)
一、求八皇后有多少种解法 (枚举)
1.什么是八皇后:
在8*8的棋盘格中,当我们在第一行下棋之后,第二行不能与第一行同列并且不能在它的对角线上,第三行不仅不能与第一行在同一列和同一对角线上,也不能与第二行在同一列和同一对角线上,以此类推,接下来,我们用一张图进行说明:
当然我这种方法没有成功,但是有很多成功的方法,那么究竟有多少种成功的方法呢 ?我们可以利用枚举法通过代码来实现
int GetQueen() { int count = 0; for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { if (j == i || j - i == 1 || j - i == -1) //不能放在与第一行相同的列和对角线上 { continue; } for (int k = 0; k < 8; k++) { //不能放在与第一行相同的列和对角线上,并且不能放在与第二行相同的列和对角线上 if (k == j || k - j == 1 || k - j == -1 || k == i || k - i == 2 || k - i == -2) { continue; } for (int s = 0; s < 8; s++) { if (s == k || s - k == 1 || s - k == -1 || s == j || s - j == 2 || s - j == -2 || s == i || s - i == 3 || s - i == -3) { continue; } for (int m = 0; m < 8; m++) { if (m == s || m - s == 1 || m - s == -1 || m == k || m - k == 2 || m - k == -2 || m == j || m - j == 3 || m - j == -3 || m == i || m - i == 4 || m - i == -4) { continue; } for (int n = 0; n < 8; n++) { if (n == m || n - m == 1 || n - m == -1 || n == s || n - s == 2 || n - s == -2 || n == k || n - k == 3 || n - k == -3 || n == j || n - j == 4 || n - j == -4 || n == i || n - i == 5 || n - i == -5) { continue; } for (int p = 0; p < 8; p++) { if (p == n || p - n == 1 || p - n == -1 || p == m || p - m == 2 || p - m == -2 || p == s || p - s == 3 || p - s == -3 || p == k || p - k == 4 || p - k == -4 || p == j || p - j == 5 || p - j == -5 || p == i || p - i == 6 || p - i == -6) { continue; } for (int q = 0; q < 8; q++) { if (q == p || q - p == 1 || q - p == -1 || q == n || q - n == 2 || q - n == -2 || q == m || q - m == 3 || q - m == -3 || q == s || q - s == 4 || q - s == -4 || q == k || q - k == 5 || q - k == -5 || q == j || q - j == 6 || q - j == -6 || q == i || q - i == 7 || q - i == -7) { continue; } count++; printf("i==%d,j==%d,k==%d,s==%d,m==%d,n==%d,p==%d,q==%d\n", i, j, k, s, m, n, p, q); } } } } } } } } return count; } int main() { int res = GetQueen(); printf("%d\n", res); return 0; }
运行结果:总共有92种这种解法
i==0,j==4,k==7,s==5,m==2,n==6,p==1,q==3 i==0,j==5,k==7,s==2,m==6,n==3,p==1,q==4 i==0,j==6,k==3,s==5,m==7,n==1,p==4,q==2 i==0,j==6,k==4,s==7,m==1,n==3,p==5,q==2 i==1,j==3,k==5,s==7,m==2,n==0,p==6,q==4 i==1,j==4,k==6,s==0,m==2,n==7,p==5,q==3 i==1,j==4,k==6,s==3,m==0,n==7,p==5,q==2 i==1,j==5,k==0,s==6,m==3,n==7,p==2,q==4 i==1,j==5,k==7,s==2,m==0,n==3,p==6,q==4 i==1,j==6,k==2,s==5,m==7,n==4,p==0,q==3 i==1,j==6,k==4,s==7,m==0,n==3,p==5,q==2 i==1,j==7,k==5,s==0,m==2,n==4,p==6,q==3 i==2,j==0,k==6,s==4,m==7,n==1,p==3,q==5 i==2,j==4,k==1,s==7,m==0,n==6,p==3,q==5 i==2,j==4,k==1,s==7,m==5,n==3,p==6,q==0 i==2,j==4,k==6,s==0,m==3,n==1,p==7,q==5 i==2,j==4,k==7,s==3,m==0,n==6,p==1,q==5 i==2,j==5,k==1,s==4,m==7,n==0,p==6,q==3 i==2,j==5,k==1,s==6,m==0,n==3,p==7,q==4 i==2,j==5,k==1,s==6,m==4,n==0,p==7,q==3 i==2,j==5,k==3,s==0,m==7,n==4,p==6,q==1 i==2,j==5,k==3,s==1,m==7,n==4,p==6,q==0 i==2,j==5,k==7,s==0,m==3,n==6,p==4,q==1 i==2,j==5,k==7,s==0,m==4,n==6,p==1,q==3 i==2,j==5,k==7,s==1,m==3,n==0,p==6,q==4 i==2,j==6,k==1,s==7,m==4,n==0,p==3,q==5 i==2,j==6,k==1,s==7,m==5,n==3,p==0,q==4 i==2,j==7,k==3,s==6,m==0,n==5,p==1,q==4 i==3,j==0,k==4,s==7,m==1,n==6,p==2,q==5 i==3,j==0,k==4,s==7,m==5,n==2,p==6,q==1 i==3,j==1,k==4,s==7,m==5,n==0,p==2,q==6 i==3,j==1,k==6,s==2,m==5,n==7,p==0,q==4 i==3,j==1,k==6,s==2,m==5,n==7,p==4,q==0 i==3,j==1,k==6,s==4,m==0,n==7,p==5,q==2 i==3,j==1,k==7,s==4,m==6,n==0,p==2,q==5 i==3,j==1,k==7,s==5,m==0,n==2,p==4,q==6 i==3,j==5,k==0,s==4,m==1,n==7,p==2,q==6 i==3,j==5,k==7,s==1,m==6,n==0,p==2,q==4 i==3,j==5,k==7,s==2,m==0,n==6,p==4,q==1 i==3,j==6,k==0,s==7,m==4,n==1,p==5,q==2 i==3,j==6,k==2,s==7,m==1,n==4,p==0,q==5 i==3,j==6,k==4,s==1,m==5,n==0,p==2,q==7 i==3,j==6,k==4,s==2,m==0,n==5,p==7,q==1 i==3,j==7,k==0,s==2,m==5,n==1,p==6,q==4 i==3,j==7,k==0,s==4,m==6,n==1,p==5,q==2 i==3,j==7,k==4,s==2,m==0,n==6,p==1,q==5 i==4,j==0,k==3,s==5,m==7,n==1,p==6,q==2 i==4,j==0,k==7,s==3,m==1,n==6,p==2,q==5 i==4,j==0,k==7,s==5,m==2,n==6,p==1,q==3 i==4,j==1,k==3,s==5,m==7,n==2,p==0,q==6 i==4,j==1,k==3,s==6,m==2,n==7,p==5,q==0 i==4,j==1,k==5,s==0,m==6,n==3,p==7,q==2 i==4,j==1,k==7,s==0,m==3,n==6,p==2,q==5 i==4,j==2,k==0,s==5,m==7,n==1,p==3,q==6 i==4,j==2,k==0,s==6,m==1,n==7,p==5,q==3 i==4,j==2,k==7,s==3,m==6,n==0,p==5,q==1 i==4,j==6,k==0,s==2,m==7,n==5,p==3,q==1 i==4,j==6,k==0,s==3,m==1,n==7,p==5,q==2 i==4,j==6,k==1,s==3,m==7,n==0,p==2,q==5 i==4,j==6,k==1,s==5,m==2,n==0,p==3,q==7 i==4,j==6,k==1,s==5,m==2,n==0,p==7,q==3 i==4,j==6,k==3,s==0,m==2,n==7,p==5,q==1 i==4,j==7,k==3,s==0,m==2,n==5,p==1,q==6 i==4,j==7,k==3,s==0,m==6,n==1,p==5,q==2 i==5,j==0,k==4,s==1,m==7,n==2,p==6,q==3 i==5,j==1,k==6,s==0,m==2,n==4,p==7,q==3 i==5,j==1,k==6,s==0,m==3,n==7,p==4,q==2 i==5,j==2,k==0,s==6,m==4,n==7,p==1,q==3 i==5,j==2,k==0,s==7,m==3,n==1,p==6,q==4 i==5,j==2,k==0,s==7,m==4,n==1,p==3,q==6 i==5,j==2,k==4,s==6,m==0,n==3,p==1,q==7 i==5,j==2,k==4,s==7,m==0,n==3,p==1,q==6 i==5,j==2,k==6,s==1,m==3,n==7,p==0,q==4 i==5,j==2,k==6,s==1,m==7,n==4,p==0,q==3 i==5,j==2,k==6,s==3,m==0,n==7,p==1,q==4 i==5,j==3,k==0,s==4,m==7,n==1,p==6,q==2 i==5,j==3,k==1,s==7,m==4,n==6,p==0,q==2 i==5,j==3,k==6,s==0,m==2,n==4,p==1,q==7 i==5,j==3,k==6,s==0,m==7,n==1,p==4,q==2 i==5,j==7,k==1,s==3,m==0,n==6,p==4,q==2 i==6,j==0,k==2,s==7,m==5,n==3,p==1,q==4 i==6,j==1,k==3,s==0,m==7,n==4,p==2,q==5 i==6,j==1,k==5,s==2,m==0,n==3,p==7,q==4 i==6,j==2,k==0,s==5,m==7,n==4,p==1,q==3 i==6,j==2,k==7,s==1,m==4,n==0,p==5,q==3 i==6,j==3,k==1,s==4,m==7,n==0,p==2,q==5 i==6,j==3,k==1,s==7,m==5,n==0,p==2,q==4 i==6,j==4,k==2,s==0,m==5,n==7,p==1,q==3 i==7,j==1,k==3,s==0,m==6,n==4,p==2,q==5 i==7,j==1,k==4,s==2,m==0,n==6,p==3,q==5 i==7,j==2,k==0,s==5,m==1,n==4,p==6,q==3 i==7,j==3,k==0,s==2,m==5,n==1,p==6,q==4 92 D:\c程序\p2-1\Debug\p2-1.exe (进程 13284)已退出,代码为 0。 要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。 按任意键关闭此窗口. . .
二、组合硬币问题(枚举)
在一个陌生的国度中,有5种不同的硬币单位:15,23,29,41,67,寻找所有组成18元8分(即1808分)的可能有多少种可能?
(在这到题中,我们知道随机抽取这些面值的硬币,都有可能组成1808,所以我们可以通过枚举法判断15用了多少,23用了多少等等...,从而通过枚举将所有情况列举出来)
int get_money() { int count = 0; int i, j, k, l, m; for (i = 0; i < 1808/15; i++) { for (j = 0; j <1808/23; j++) { if (i * 15 + j * 23 > 1808) { continue; } for (k = 0; k <1808/29; k++) { if (i * 15 + j * 23 + k * 29 > 1808) { continue; } for (l = 0; l < 1808/41; l++) { if (i * 15 + j * 23 + k * 29 + l * 41 > 1808) { continue; } for (m = 0; m < 1808/67; m++) { if (i*15 + j*23 + k*29 + l*41 + m*67 == 1808) { count++; } } } } } } return count; } int main() { int count = get_money(); printf("%d", count); }
运行结果:
19551 D:\c程序\p2-1\Debug\p2-1.exe (进程 840)已退出,代码为 0。 要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。 按任意键关闭此窗口. . .
三、求二进制中有多少个1(位运算)
在这道题中,我们想到了位运算,只要将二进制数与1按位&,然后将二进制数右移一位直到这个二进制数为0,就可以得到有多少个1了,下面我们将代码运行一下
int Get_count(unsigned int a) //注意负数要将负数进行无符号化 { int count = 0; while (a) { if (a & 1) //也可以直接写成 n&=n-1; 每次都丢弃最右边的1(一定要记住) { count++; } a = a >> 1; } return count; } int main() { int count = Get_count(7); printf("%d", count); }
运行结果:
3 D:\c程序\p2-1\Debug\p2-1.exe (进程 17812)已退出,代码为 0。 要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。 按任意键关闭此窗口. . .
在使用二进制运算中位运算要比普通的数学运算的效率高很多,所以当我们能够使用位运算的时候一定要使用位运算,来提高算法效率。
本文含有隐藏内容,请 开通VIP 后查看