首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

小程序答案有缺陷,分书有关问题

2013-10-10 
小程序答案有缺陷,分书问题问题描述:学校放寒假时,信息学竞赛教师有A、B、C、D、E共5本书,要分给参加培训的张、

小程序答案有缺陷,分书问题
问题描述:学校放寒假时,信息学竞赛教师有A、B、C、D、E共5本书,要分给参加培训的张、王、刘、孙、李5位学生,已知张同学喜爱C和D两本书,王同学喜爱A,B和E三本书,刘同学喜爱B和C两本书,孙同学喜爱D这本书,李同学喜爱B和E两本书,每人只能选1本书。编写程序帮助教师求出所有可能的分书方案,使得每个学生都满意。


#include <stdio.h>
int num[1000][5]={0};
int j=0;
int chenggong(int a[],int n)
{
    int m;                          //如果不加这三行能正常运行,但不能排除分到重复的书
    for(m=0;m<n;m++)         //例如:31242 这种情况,不符合题目要求
        if(a[m]==a[n]) break;   //但加上这三行,也能正常运行,但无解。
    if(m==n)
    {
      switch(n)
     {
        case 0:
        {
            if(a[n]==3||a[n]==4) return 1;
            else return 0;
            break;
        }
        case 1:
        {
            if(a[n]==1||a[n]==2||a[n]==5) return 1;
            else return 0;
            break;
        }
        case 2:
        {
            if(a[n]==2||a[n]==3) return 1;
            else return 0;
            break;
        }
        case 3:
        {
            if(a[n]==4) return 1;
            else return 0;
            break;
        }
        case 4:
        {
            if(a[n]==2||a[n]==5) return 1;
            else return 0;
            break;
        }
      }
    }
    else return 0;
}
int fenshu(int a[],int n)      //类似于八皇后的解法,分别用12345表示ABCDE五本书
{
    int i,k;
    for(i=1;i<=5;i++)
    {   
        a[n]=i;
        if(chenggong(a,n))
        {
            if(n==5)
            {
                for(i=0;i<5;i++)
                    num[j][i]=a[i];
                j++;
            }
            else fenshu(a,n+1);
        }
    }
}
int main()
{
    int a[5]={1,1,1,1,1};
    int i,k;
    fenshu(a,0);
    for(i=0;i<j;i++)
    {
        for(k=0;k<5;k++)
            printf("%d ",num[i][k]);
        printf("\n");
    }
    return 0;
}
八皇后 递归回溯 分书问题
[解决办法]
简单的数学逻辑题
倒推法:

为了让大家都能满意,所以


->孙同学D书->张同学C书->刘同学B书->李同学E书->王同学A书


这就是最终的结果了,为什么楼主这么多复杂?难道是我哪里想简单了?



[解决办法]
//学校放寒假时,信息学竞赛教师有A、B、C、D、E共5本书,要分给参加培训的张、王、刘、孙、李5位学生,
//已知张同学喜爱C和D两本书,王同学喜爱A,B和E三本书,刘同学喜爱B和C两本书,孙同学喜爱D这本书,李同学喜爱B和E两本书,
//每人只能选1本书。编写程序帮助教师求出所有可能的分书方案,使得每个学生都满意。
#include <stdio.h>
#include <locale.h>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
    int i,n;

    setlocale(LC_ALL,"chs");
    vector<char> P(5);
    vector<char>::iterator b,e;
    b=P.begin();
    e=P.end();
    for (i=0;i<5;i++) P[i]='A'+i;
    n=0;
    do {
        if ((P[0]=='C' 
[解决办法]
 P[0]=='D')
         && (P[1]=='A' 
[解决办法]
 P[1]=='B' 
[解决办法]
 P[1]=='E')
         && (P[2]=='B' 
[解决办法]
 P[2]=='C')
         && (P[3]=='D')
         && (P[4]=='B' 
[解决办法]
 P[4]=='E')) {
            printf("%2d: ",++n);
            for(i=0;i<5;i++) printf("%.2s%c","张王刘孙李"+i*2,P[i]);
            printf("\n");
        }
    } while (next_permutation(b,e));
    printf("The total: %d",n);
    return 0;
}
// 1: 张C王A刘B孙D李E
//The total: 1

热点排行