C语言例题总结二

发布于:2023-01-10 ⋅ 阅读:(352) ⋅ 点赞:(0)

目录:

一、求八皇后有多少种解法(穷举法)

二、组合硬币问题(穷举法)

三、求二进制中有多少个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 后查看

网站公告

今日签到

点亮在社区的每一天
去签到