用C语言编程,输出1,2,3,4在两行两列表格的各种排列,请利用二重循环寻找填法 10
展开全部
这个问题和两行两列没多大关系,主要就是求P4的全排列(共24种)。
然后在输出的时候考虑一下格式就可以了。
下面讲一下具体方法(回溯法)。
用data[4]来表示表格数据,used[5]记录某个数据是否已经被填过了。
两重循环:外层循环(i)从0到3不断地来来回回指定被填数data[i];内层循环试着从小到大不断的尝试填写data[i]。
下面是源代码,有注释的,就耐着性子慢慢看慢慢研究吧。
#include <stdio.h>
int main(void){
int i;
int data[4],used[5]={0},cas=1;
//循环的初始化
i=0;
data[0]=0;
while(1){
//data[i]从1到4枚举每一种情况。
do{
data[i]++;
}while(data[i]<=4 && used[data[i]]);
if(data[i]<=4){//data[i]填好了
if(i==3){
//所有数据都填写好了,输出
printf("CASE: %d\n",cas++);
printf("%d %d\n%d %d\n",data[0],data[1],data[2],data[3]);
used[data[--i]]=0;//清理used[],并把i减1
}
else{
//并非所有数据都填写好
used[data[i]]=1;//data[i]这个数据已经用过,记录一下。
data[++i]=0;//准备开始试填下一个了。
}
}
else{//data[i..3]枚举完了,考虑i-1的情况。
if(i==0) break;
used[data[--i]]=0;//清理used[],并把i减1
}
}
return 0;
}
然后在输出的时候考虑一下格式就可以了。
下面讲一下具体方法(回溯法)。
用data[4]来表示表格数据,used[5]记录某个数据是否已经被填过了。
两重循环:外层循环(i)从0到3不断地来来回回指定被填数data[i];内层循环试着从小到大不断的尝试填写data[i]。
下面是源代码,有注释的,就耐着性子慢慢看慢慢研究吧。
#include <stdio.h>
int main(void){
int i;
int data[4],used[5]={0},cas=1;
//循环的初始化
i=0;
data[0]=0;
while(1){
//data[i]从1到4枚举每一种情况。
do{
data[i]++;
}while(data[i]<=4 && used[data[i]]);
if(data[i]<=4){//data[i]填好了
if(i==3){
//所有数据都填写好了,输出
printf("CASE: %d\n",cas++);
printf("%d %d\n%d %d\n",data[0],data[1],data[2],data[3]);
used[data[--i]]=0;//清理used[],并把i减1
}
else{
//并非所有数据都填写好
used[data[i]]=1;//data[i]这个数据已经用过,记录一下。
data[++i]=0;//准备开始试填下一个了。
}
}
else{//data[i..3]枚举完了,考虑i-1的情况。
if(i==0) break;
used[data[--i]]=0;//清理used[],并把i减1
}
}
return 0;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询