一、乒乓球对手匹配:A:不和Z,C不和X、Z void Match()//穷举
{
for(char a='X';a<='Z';a++)//A的对手
{
for(char b='X';b<='Z';b++)
{
for(char c='X';c<='Z';c++)
{
if(a!='X' && c!='X' && c!='Z' &&
a!=b && b!=c && a!=c)
{
printf("A->%c,B->%c,C->%c\n",a,b,c);
}
}
}
}
}
int main()
{
Match();
return 0;
}
二、八皇后问题 (1)最简单但有点繁琐的枚举法 int Queen8()
{
int count = 0;
for(int q1=0;q1<8;q1++)
{
for(int q2=0;q2<8;q2++)
{
if(q1==q2 || q1-1==q2 || q1+1==q2)
{
continue;
}
for(int q3=0;q3<8;q3++)
{
if(q1==q3 || q1-2==q3 || q1+2==q3 ||
q2==q3 || q2-1==q3 || q2+1==q3)
{
continue;
}
for(int q4=0;q4<8;q4++)
{
if(q1==q4 || q1-3==q4 || q1+3==q4 ||
q2==q4 || q2-2==q4 || q2+2==q4 ||
q3==q4 || q3-1==q4 || q3+1==q4)
{
continue;
}
for(int q5=0;q5<8;q5++)
{
if(q1==q5 || q1-4==q5 || q1+4==q5 ||
q2==q5 || q2-3==q5 || q2+3==q5 ||
q3==q5 || q3-2==q5 || q3+2==q5 ||
q4==q5 || q4-1==q5 || q4+1==q5)
{
continue;
}
for(int q6=0;q6<8;q6++)
{
if(q1==q6 || q1-5==q6 || q1+5==q6 ||
q2==q6 || q2-4==q6 || q2+4==q6 ||
q3==q6 || q3-3==q6 || q3+3==q6 ||
q4==q6 || q4-2==q6 || q4+2==q6 ||
q5==q6 || q5-1==q6 || q5+1==q6)
{
continue;
}
for(int q7=0;q7<8;q7++)
{
if(q1==q7 || q1-6==q7 || q1+6==q7 ||
q2==q7 || q2-5==q7 || q2+5==q7 ||
q3==q7 || q3-4==q7 || q3+4==q7 ||
q4==q7 || q4-3==q7 || q4+3==q7 ||
q5==q7 || q5-2==q7 || q5+2==q7 ||
q6==q7 || q6-1==q7 || q6+1==q7)
{
continue;
}
for(int q8=0;q8<8;q8++)
{
if(q1==q8 || q1-7==q8 || q1+7==q8 ||
q2==q8 || q2-6==q8 || q2+6==q8 ||
q3==q8 || q3-5==q8 || q3+5==q8 ||
q4==q8 || q4-4==q8 || q4+4==q8 ||
q5==q8 || q5-3==q8 || q5+3==q8 ||
q6==q8 || q6-2==q8 || q6+2==q8 ||
q7==q8 || q7-1==q8 || q7+1==q8)
{
continue;
}
printf("%d,%d,%d,%d,%d,%d,%d,%d\n",q1,q2,q3,q4,q5,q6,q7,q8);
count++;
}
}
}
}
}
}
}
}
return count;
}
(2)看起来比较简便的做法(枚举法) //八皇后遍历 使用枚举法
bool IsConflict(int arr[],int size)
{
int i = 0;
int j = 0;//j是i之后的元素,也是下一行元素,因为一行只有一个棋子,所以这样表示
for(i = 2;i<=size;i++)
for(j = 1;j<i;j++)
{
if(arr[i] == arr[j] || abs(arr[i]-arr[j]) == i-j)//1.在一行或者在一列上,2.列(对角线)冲突
每次比较两列两行,且每次循环从第一、二行,第1、2列开始
return true;
}
return false;
}
void Queen8()
{
int arr[9] = {};//数组长度是9,从1开始,只使用1-8
int i = 0;
int count= 0;
for(arr[1] = 1;arr[1]<9;arr[1]++)
for(arr[2] = 1;arr[2]<9;arr[2]++)
for(arr[3] = 1;arr[3]<9;arr[3]++)
for(arr[4] = 1;arr[4]<9;arr[4]++)
for(arr[5] = 1;arr[5]<9;arr[5]++)
for(arr[6] = 1;arr[6]<9;arr[6]++)
for(arr[7] = 1;arr[7]<9;arr[7]++)//第7行第1...8列
for(arr[8] = 1;arr[8]<9;arr[8]++)//第8行第1...8列
{
if(IsConflict(arr,8))
{
continue;
}
else
{
printf("第%d种情况:",++count);
for(i = 1;i<9;i++)
{
printf("%3d",arr[i]);
}
printf("\n");
}
}
}
int main()
{
Queen8();
return 0;
} //要会写8皇后先要会写4皇后
void Queen4()
{
int arr[5] = {};//数组长度是5,从1开始,只使用1-4
int i = 0;
int count= 0;
for(arr[1] = 1;arr[1]<5;arr[1]++)
for(arr[2] = 1;arr[2]<5;arr[2]++)
for(arr[3] = 1;arr[3]<5;arr[3]++)
for(arr[4] = 1;arr[4]<5;arr[4]++)
{
if(IsConflict(arr,4))
{
continue;
}
else
{
printf("第%d种情况:",++count);
for(i = 1;i<5;i++)
{
printf("%3d",arr[i]);
}
printf("\n");
}
}
}
int main()
{
Queen4();
return 0;
}
三、由八皇后引出的问题(在一个陌生的国度,有5种不同的硬币单位:15、23、29、41和67(分)。寻找所有组成18元8分(即1808分)的可能组合。
假定对于所有面值的硬币你都有足够的硬币。) #include<stdio.h>
void Group(int cents1,int cents2,int cents3,int cents4,int cents5,int money)
{
int i = 0;
int j = 0;
int k = 0;
int m = 0;
int n = 0;
int sum = 0;
for(i = 0;i<=(money/cents1);i++)
{
for(j = 0;j<=(money/cents2);j++)
{
for(k = 0;k<=(money/cents3);k++)
{
for(m = 0;m<=(money/cents4);m++)
{
for(n = 0;n<=(money/cents5);n++)
{
if(i*cents1+j*cents2+k*cents3+m*cents4+n*cents5 == money)
{
printf("%d,%d,%d,%d,%d\n",i,j,k,m,n);
sum++;
}
}
}
}
}
}
printf("%d\n",sum);
}
int main()
{
Group(15,23,29,41,67,1808);
return 0;
}
欢迎指出错误~