C语言经典例题——第一例
问题:刚好有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
思路:三个数字,每一位数字都代表一重循环,只需要判断让数字不相同即可。
解法一:
#include <stdio.h>
int main(){
int i,j,k,count=1;
for(i=1;i<5;i++)
for(j=1;j<5;j++)
for(k=1;k<5;k++)
if(i!=j&&i!=k&&j!=k)
printf("组成第%d个数字是:%d%d%d\n",count++,i,j,k);
}
解法二:
在第二重循环就判断,省去不必要循环。
int main(void)
{
int i,j,k,count=0;
for(i = 1;i < 5;i++)
{
for(j = 1;j < 5;j++)
{
if(i == j)
continue;
for(k = 1;k < 5;k++)
{
if(i == k || j == k)
continue;
printf("%d,%d,%d\n",i,j,k);
count++;
}
}
}
printf("共有%d种。\n",count);
return 0;
}
解法三:(个人不建议初学者学习)
int b[4],arr[4];//定义两个数组用来类比
int Count=0;//计数器
void DFS(int step){
int i;
if(step==5){
if(arr[1]!=arr[2]&& arr[1]!=arr[3]&&arr[2]!=arr[3]){//判断哪些符合条件
Count++;
printf("%d%d%d\n",arr[1],arr[2],arr[3]);//输出可用排列
}
return ;
}
for(i=1;i<=4;i++){
if(b[i]==0){
arr[step]=i;
b[i]=1;//排除重复
DFS(step+1);//自己调用自己
b[i]=0;
}
}
return ;
}
int main(void)
{
DFS(1);
printf("共有%d种",Count);
return 0;
}