标题:这道题的条件如何转换?
只看楼主
zhaogay
Rank: 7Rank: 7Rank: 7
来 自:宫
等 级:黑侠
帖 子:151
专家分:586
注 册:2013-10-10
得分:3 
程序代码:
#include <stdio.h>
struct teacher {
        int n1; /* 课程编号,默认 n1<n2 */
        int n2;
};
int check(struct teacher T) {
    /* 教语文的不教算术、音乐和地理 */
    if (T.n1 == 1 || T.n2 == 1){
        if (T.n1 == 3 || T.n2 == 3 ||\
            T.n1 == 5 || T.n2 == 5 ||\
            T.n1 == 4 || T.n2 == 4)
            return -1;
    }
    /* 教地理的不教算术 */
    if (T.n1 == 4 || T.n2 == 4) {
        if (T.n1 == 1 || T.n2 == 1||\
            T.n1 == 3 || T.n2 == 3)
            return -1;
    }
    return 0;
}
int main() {
    int i, j, m, n, k;
    struct teacher A, B, C;
    for (i=1;i<6;i++) {
        for (j = i+1; j < 7; j++) {
            A.n1 = i;
            A.n2 = j;
            /* A不教算术和地理 */
            if (A.n1 == 3|| A.n1 == 4|| A.n2 == 3|| A.n2 == 4)
                continue;
            for(m=1;m<6;m++)
                for(n=m+1; n<7; n++) {
                    B.n1 = m;
                    B.n2 = n;
                    /* B不教地理,音乐,语文 */
                    if (B.n1 == 1||B.n1 == 4||B.n1 == 5 ||\
                        B.n2 == 1||B.n2 == 4||B.n2 == 5) {
                        continue;
                    }
                    if ( (m==i||m==j) ||(n==i||n==j))
                        continue;
                    for(k=1;k<7;k++)
                        if (k != i && k != j && k != m && k != n) {
                            C.n1 = k;
                            C.n2 = 1+2+3+4+5+6-m-n-i-j-k;
                            break;
                        }
                    /* 检查是否符合题目条件 */
                    if ( check(A) || check(B) || check(C) ){
                        continue;
                    } else {
                        /* 输出 */
                        printf("A %d  %d\n", A.n1, A.n2);
                        printf("B %d  %d\n", B.n1, B.n2);
                        printf("C %d  %d\n\n", C.n1, C.n2);
                    }
                }/* end while m*/
        }/* end while j */
    }/* end while i*/
    return 0;
}
最后得出两组,不知道是不是对的。

好好学习,天天想上
2013-11-06 00:05
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:0 
虽然楼上的代码更工整一些,但pycansi毕竟是第一个提交正确代码的人,所以依约这100分要送给pycansi了。

顺道附上我的代码,交流一下编码心得。

需要解释一下的是我的代码中三位老师以及六门课程是以位来表达的。用一个整型变量来表示三人的一种带课状态。从低到高,每6位代表一个老师所带课程的状态,这6位按题目的编号顺序从低到高表示每门课程,1表示这位老师教这门课,0表示不教。

程序代码:
//////////////////////////////////////////////////////////////////////
// 在山区小学往往一个教师要兼多门课。
// 现已知三位教师A,B,C,各教两门课,互不重复。
// 共有下述6门课:语文、外语、算术、地理、音乐和美术。
// 已知如下情况:
// 1.语文老师和算术老师是邻居;
// 2.地理老师比语文老师年龄大;
// 3.A每到假期都要约地理老师和算术老师去赶集;
// 4.B最年轻;
// 5.B经常约语文老师和音乐老师到他家聊天。
// 请你编程输出A、B、C三个各教哪两门课。
// 为了输出方便,我们将6门课编号如下:
// 课名    编号
// 语文    1
// 外语    2
// 算术    3
// 地理    4
// 音乐    5
// 美术    6
// 输出格式
// 屏幕输出三行,每行两个编号,编号间有一个空格,从小到大输出。
// 第一行的两个编号表示A所教的两门课程;
// 第二行的两个编号是B所教的课;
// 第三行是C所教的课。
//////////////////////////////////////////////////////////////////////

#include <stdio.h>

//每人只能教两门课且互不重复
int c0(int s)
{
    int p, t, i, j;
    for(p = i = 0; i < 3; i++)
    {
        t = s >> i * 6 & 0x3f;
        p ^= t;
        for(j = 0; t; t &= t - 1) j++;
        if(j - 2) return 0;
    }
    return p == 0x3f;
}

//语文和算术不是同一个人教
int c1(int s)
{
    return !((s & 5) == 5 || (s >> 6 & 5) == 5 || (s >> 12 & 5) == 5);
}

//地理和语文不是同一个人教
int c2(int s)
{
    return !((s & 9) == 9 || (s >> 6 & 9) == 9 || (s >> 12 & 9) == 9);
}

//地理和算术不是同一个人教
int c3(int s)
{
    return !((s & 12) == 12 || (s >> 6 & 12) == 12 || (s >> 12 & 12) == 12);
}

//语文和音乐不是同一个人教
int c4(int s)
{
    return !((s & 17) == 17 || (s >> 6 & 17) == 17 || (s >> 12 & 17) == 17);
}

//A不教地理和算术
int c5(int s)
{
    return !(s & 12);
}

//B不教地理
//B不教语文和音乐
int c6_7(int s)
{
    return !(s >> 6 & 25);
}

void show_state(int s)
{
    int i, j, t;
    for(i = 0; i < 3; i++)
    {
        t = s >> i * 6 & 0x3f;
        for(j = 0; !(t & 1); j++) t >>= 1;
        printf("%d ", ++j);
        for(t >>= 1; !(t & 1); j++) t >>= 1;
        printf("%d\n", ++j);
    }
    puts("");
}

int main()
{
    int (*C[])(int) = {c0, c1, c2, c3, c4, c5, c6_7};
    int i, j;
    for(i = 0x3330; i < 0x30303; i++)
    {
        for(j = 0; j < sizeof(C) / sizeof(C[0]) && C[j](i); j++);
        if(j >= sizeof(C) / sizeof(C[0]))
            show_state(i);
    }
    return 0;
}

重剑无锋,大巧不工
2013-11-06 14:17
zhaogay
Rank: 7Rank: 7Rank: 7
来 自:宫
等 级:黑侠
帖 子:151
专家分:586
注 册:2013-10-10
得分:0 
回复 12楼 beyondyf
很犀利,学习了

好好学习,天天想上
2013-11-06 15:12
pycansi
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:5
帖 子:418
专家分:1060
注 册:2012-7-26
得分:0 
每次看版主大大的代码都表示压力山大,继续修炼……


莫问前尘有愧,但求今生无悔
2013-11-06 21:25
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:0 
回复 14楼 pycansi
呵呵,代码可以慢慢看,先去把我奖你的分领了如何。

https://bbs.bccn.net/thread-423137-1-1.html
https://bbs.bccn.net/thread-423135-1-1.html

重剑无锋,大巧不工
2013-11-06 22:04
pycansi
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:5
帖 子:418
专家分:1060
注 册:2012-7-26
得分:0 
回复 15楼 beyondyf
不好意思,久等了


莫问前尘有愧,但求今生无悔
2013-11-06 23:47
qunxingw
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:24
帖 子:1676
专家分:7295
注 册:2011-6-30
得分:3 
利用8皇后的递归设计。
程序代码:
#include<stdio.h>
#include<stdlib.h>
char A[3][2];
char a[]={'1','2','3','4','5','6'};
int isok(int k)//分析A[][]当前数与前面的数比较为递归 作准备。 
{

 int flat=1;
  for(int m=0; m<k; m++)//排除相同的 
     {
      if(A[k/2][k%2]==A[m/2][m%2])
      flat=0;
     }

 if(A[k/2][k%2]=='1' && A[k/2][k%2-1]=='3'&& k%2>=1)  //1条件
                     flat=0;

 if(A[k/2][k%2]=='3' && A[k/2][k%2-1]=='1'&& k%2>=1) //1条件
                     flat=0;

 if(A[k/2][k%2]=='4' && A[k/2][k%2-1]=='1'&& k%2>=1 )//2
                     flat=0;

 if(A[k/2][k%2]=='1' && A[k/2][k%2-1]=='4'&& k%2>=1 )//2
                     flat=0;

 if(A[k/2][k%2]=='4' && A[k/2][k%2-1]=='3'&& k%2>=1)//3
                       flat=0;

 if(A[0][k%2]=='4'|| A[0][k%2]=='3' )//3
      flat=0;

 

 if(A[1][k%2]=='4')//4
      flat=0;

 if(A[1][k%2]=='1' || A[1][k%2]=='5' )//5
                   flat=0;

 if(A[k/2][k%2]=='1' &&  A[k/2][k%2-1]=='5')//5
                     flat=0;

 if(A[k/2][k%2]=='5' && A[k/2][k%2-1]=='1'&& k%2>=1 )//5
                     flat=0;  

 if(A[k/2][k%2-1]>A[k/2][k%2] && k%2>=1)//从小到大排 
            flat=0;

 
    return flat;
}

void output()
{

 int i,j;

 for(i=0; i<3;i++)

 {
  for(j=0; j<2;j++)
   
   
   printf("%2c",A[i][j]);
  
  printf("\n");

 }

 printf("\n");
}

void ok(int n)
{

 int j;

 if(n==6)

 {
  output();
  return ;

 }

 
    for(j=0;j<6;j++)

 {
  A[n/2][n%2]=a[j];
  if(isok(n) ) ok(n+1);

 }
}

int main()
{

 ok(0);

 system("pause");

 return 0;
}

www.qunxingw.wang
2013-11-07 11:57
a9438
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2016-5-19
得分:0 
#include<stdio.h>
int a[6];
int main()
{int i,j,k,l,n,m,s=1;
 void print(int);
 int judge(int,int);
 for(i=1;i<=6;i++)
 {a[0]=i;
  if(a[0]==2||a[0]==4) continue;
  for(j=1;j<=6;j++)
  {a[1]=j;
   if(a[1]==2||a[1]==4) continue;
   for(k=2;k<=6;k++)
   {a[2]=k;
    if(a[2]==4||a[2]==5) continue;
    for(l=2;l<=6;l++)
    {a[3]=l;
     if(a[3]==4||a[3]==5) continue;
     for(m=1;m<=6;m++)
     {a[4]=m;
      for(n=1;n<=6;n++)
      {a[5]=n;
       if(a[5]!=a[4]&&a[5]!=a[1]&&a[5]!=a[0]&&a[5]!=a[3]&&a[5]!=a[2]&&a[4]!=a[1]&&a[4]!=a[0]&&a[4]!=a[3]&&a[4]!=a[2]&&a[1]!=a[0]&&a[1]!=a[2]&&a[1]!=a[3]&&a[0]!=a[2]&&a[0]!=a[3]&&a[2]!=a[3]&&judge(2,3)&&judge(1,4))
        {printf("第%d种情况\n",s);
         printf("A ");print(a[0]);printf(" ");print(a[1]);printf("\n");
         printf("B ");print(a[2]);printf(" ");print(a[3]);printf("\n");
         printf("C ");print(a[4]);printf(" ");print(a[5]);printf("\n");
         s++;
        }
      }
     }
    }
   }
  }
 }
}
int judge(int x,int y)
{
  if((a[0]==x&&a[1]!=y||a[0]==y&&a[1]!=x)||(a[2]==x&&a[3]!=y||a[2]==y&&a[3]!=x)||(a[4]==x&&a[5]!=y||a[4]==y&&a[5]!=x))
   return 1;
  else return 0;
}
void print(int x)
{
 switch(x)
 {case 1:printf("Chinese");break;
  case 2:printf("Math");break;
  case 3:printf("Politics");break;
  case 4:printf("Geography");break;
  case 5:printf("Music");break;
  case 6:printf("Art");break;
  default:break;
 }
}
能不能看看我的答案是否正确啊。
(题目:
A,B,C 3人是小学老师,各教两门课,互不重复。
共有如下6门课:语文,算术,政治,地理,音乐和美术。
已知:
政治老师和算术老师是邻居。
地理老师比语文老师年龄大。
B最年轻。
A经常对地理老师和算术老师讲他看过的文学作品。
B经常和音乐老师,语文老师一起游泳。
2016-05-19 16:50



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-423028-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.381605 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved