按rule全排列数字筛选(0-1背包)

来源:互联网 发布:曲靖市罗平县经济数据 编辑:程序博客网 时间:2024/04/28 21:20
//我有一列数1,2,3,4,5,6,7,8,9要实现全排序。要求1在2,3,4的左边,2在5,6的左边,3在6的左边,4在7的左边,5,6,7在8的左边,8在9的左边。其它的数位置随意,(如:1,4,2,3,5,7,6,8,9)怎么实现几个数字的全排序。 #include "stdio.h"int F_PRINT(int *map,int len){for (int i=1;i<=len;++i){printf("%d ",map[i]);}printf("\n");return 0;}bool F_Rule_Check(int *map,int len,int left,int right){for (int i=1;i<=len;++i){if (map[i]==left){return true;}if (map[i]==right){return false;}}return false;}bool F_Filter_Diff(int *map,int len){for (int i=1;i<len;++i){for (int j=i+1;j<=len;++j){if (map[j]==0){continue;}if (map[i]==map[j]){return false;}}}return true;}bool F_Filter_Rule(int *map,int len){return F_Rule_Check(map,len,1,2)&&F_Rule_Check(map,len,1,3)&&F_Rule_Check(map,len,1,4)&&F_Rule_Check(map,len,2,5)&&F_Rule_Check(map,len,2,6)&&F_Rule_Check(map,len,3,6)&&F_Rule_Check(map,len,4,7)&&F_Rule_Check(map,len,5,8)&&F_Rule_Check(map,len,6,8)&&F_Rule_Check(map,len,7,8)&&F_Rule_Check(map,len,8,9);}int F_Arrange(int *map,int len,int loc){if (!F_Filter_Diff(map,len)){return 1;}if (loc>len&&F_Filter_Diff(map,len)){if (F_Filter_Rule(map,len)){return F_PRINT(map,len);}else return 1;}for (int i=1;i<=len;++i){map[loc]=i;F_Arrange(map,len,loc+1);map[loc]=0;}return 0;} int main(){int map[10]={0};F_Arrange(map,9,1);return 0;} 

 
原创粉丝点击