回 帖 发 新 帖 刷新版面

主题:讨论一道轮休的程序题....各抒己见!!

下午看了个算法题:

题目如下:
//安排轮休.
//某公司有7个保安:A,B,C,D,E,F,G.为了工作需要,每人每周只能休息一天
//他们的选择如下:
//  A: 星期二,四;
//  B: 星期一,六;
//  C: 星期三,日;
//  D: 星期五;
//  E: 星期一,四,六;
//  F: 星期二,五;
//  G: 星期三,六,日;
//  安排一个轮休表,让他们满意.

我写的程序如下....可以执行的时候屏幕上面什么也没有...请大家看看...我是不是设

计的有问题..

#include <stdio.h>
void main()
{
  int a=0,b=0,c=0,d=0,e=0,f=0,g=0;
  for (a=1;a<=7;a++)
   for (b=1;b<=7;b++)
   {
      if (a==b) continue;                         //a,b不能休息同一天
       for (c=1;c<=7;c++)
       {
        if ((c==a)||(c==b)) continue;             //a,b,c不能休息同一天
        if ((c!=3)||(c!=7)) continue;
         for (d=1;d<=7;d++)
        {
          if ((d==a)||(d==b)||(d==c)) continue;   //abcd不能休息同一天
          if (d!=5) continue;

          for (e=1;e<=7;e++)
          {
          if((e==a)||(e==b)||(e==c)||(e==d)) continue;
          if ((e!=1)||(e!=4)||(e!=6)) continue;
          
          for(f=1;f<=7;f++)
          {
          if ((f==a)||(f==b)||(f==c)||(f==d)||(f==e)) continue;
          if((f!=2)||(f!=5)) continue;
          g=28-a-b-c-d-e-f;
          if((g!=3)||(g!=6)||(g!=7)) continue;
          if(a==2||a==4)+(b==1||b==6)+(c==3||c==7)+(d==5)+(e==1||e==4||e==6)
                  +(f==2||f==5)+(g==3||g==6||g==7)==7;     
          {
              printf("A是在星期%d\休息n",a);   
              printf("B是在星期%d\休息n",b);
              printf("C是在星期%d\休息n",c);
              printf("D是在星期%d\休息n",d);
              printf("E是在星期%d\休息n",e);
              printf("F是在星期%d\休息n",f);  
              printf("G是在星期%d\休息n",g);
           }
          }
          }
         }
       }
      }
}


编译,连接都通过了   可以没有得到答案....请大家指点一下..谢谢!!

大家有什么想法尽管提出!![em4]

回复列表 (共8个回复)

沙发

符号很多不规范
仔细检查
有些问题是由于细节引起的
虽然没有错误显示

板凳

逻辑关系出现错误
if( ( c != 3 ) || ( c != 7 ) )应修改成 if( ( c != 3 ) && ( c != 7 ) )
其他的同理。

您的程序虽然通过编译,但还是存在一些问题,比如 if(a==2||a==4)+(b==1||b==6)+(c==3||c==7)+(d==5)+(e==1||e==4||e==6)+(f==2||f==5)+(g==3||g==6||g==7)==7; 这一句就有问题--少了一对(),即使这样,我觉得改成if( ( a==2 || a==4 ) &&( b==1 || b==6 ) && ( c==3 || c==7 ) && ( d==5 ) && ( e==1 || e==4 || e==6 ) &&( f==2 || f==5 ) && ( g==3 || g==6 || g==7 ) ); 会更好一些

我按你的思路编了一下,得出了结果,如果你要的话我可以发给你。

3 楼

这是不是就是一道枚举题呀?
http://www.programfan.com/club/showbbs.asp?id=90952
和这道差不多?

4 楼

// 我用 dfs 写了个程序,貌似更清晰一些。
// 不用再判断重复(used[]),其实直接目测就可以看出一部分结果.

// 最后给你个提示,判断 1-N 这 N 个数是否户不相等,可以采用如下代码:

if (a+b+c+...+x+y+z != M /*M = 1+2+3+...+N */) return;/break;/continue;
if (a*b*c*...*x*y*z != K /*K = N! = 1*2*3*...*N*/) return;/break;/continue;


#include <Stdio.h>
#include <string.h>

bool used[7];
int list[7];

void dfs(int depth)
{
  int index;

  if (depth == 7) {

    if (list[0] != 1 && list[0] != 3) return;
    if (list[1] != 0 && list[1] != 5) return;
    if (list[2] != 2 && list[2] != 6) return;
    if (list[3] != 4) return;
    if (list[4] != 0 && list[4] != 3 && list[4] != 5) return;
    if (list[5] != 1 && list[5] != 4) return;
    if (list[6] != 2 && list[6] != 5 && list[6] != 6) return;

    for (index = 0; index < 7; index++)
      printf("%c:星期%d", (char)(65+index), list[index]+1);

    return;
  }
  

  for (index = 0; index < 7; index++)
    if (!used[index]) {
      list[depth] = index; used[index] = 1;
      dfs(depth + 1);
      used[index] = 0
    }
}

int main()
{
  memset (used, 0, sizeof(used));
  memset (list, 0, sizeof(int));

  dfs(0);

  return 0;
}

5 楼

细节问题,常常会导致出错的啊!
我竞赛的时候解决一题很简单的题目,由于细节问题,耗了我好多时间,比如逻辑关系什么的,好像你上面的问题啊!

6 楼

#include <stdio.h>
void main()
{
int i,j,a=4,b,c,d=5,e,f=2,g;
clrscr();
printf ("A B C D E F G\n");
for (i=1;i<=2;i++)
{
  if (i==1)
  {
   b=1;
   e=6;
  }
  if (i==2)
  {
   b=6;
   e=1;
  }
  for (j=1;j<=2;j++)
  {
   if (j==1)
   {
    c=3;
    g=7;
    printf ("%d %d %d %d %d %d %d\n",a,b,c,d,e,f,g);
   }
   if (j==2)
   {
    c=7;
    g=3;
    printf ("%d %d %d %d %d %d %d\n",a,b,c,d,e,f,g);
   }
  }
}
}

7 楼

struct p
{
    int n;
    char d[3];
}r[7]={
    { 2 , { 2 , 8 , 0 } },
    { 2 , { 1 , 32, 0 } },
    { 2 , { 4 , 64, 0 } },
    { 1 , { 16, 0 , 0 } },
    { 3 , { 1 , 8 , 32} },
    { 2 , { 2 , 16, 0 } },
    { 3 , { 4 , 32, 64} }
      };
char res,day[7]={0};
int ip,flag=0;
print(char c)
{
    switch(c)
    {
    case 1 :
        printf("mon");
        break;
    case 2 :
        printf("tue");
        break;
    case 4 :
        printf("wed");
        break;
    case 8 :
        printf("thu");
        break;
    case 16 :
        printf("fri");
        break;
    case 32 :
        printf("sat");
        break;
    case 64 :
        printf("sun");
        break;
    default :
        printf("error\n");
    }
}
/**********************************************/
do_prnt()
{
    int i;

    printf("*********************************\nThe answer %d is :\n", flag);
    for(i=0;i<7;i++)
    {
        printf("%c:", 'A'+i);
        print(day[i]);
        printf("  |  ");
    }
    printf("\n");
}
/*********************************************/
f_try(int t)
{
    int i=0;
    for(;i<r[t].n;i++)
    {
        if( r[t].d[i] & res ) continue;
        else
        {
            day[ip++] = r[t].d[i];
            res += r[t].d[i];
            if(t!=6)
                f_try(t+1);
            else
            {
                flag++;
                do_prnt();
            }
            ip--;
            res &= ~r[t].d[i];
        }
    }
}
main()
{
    res=0;
    f_try(0);
    if(flag==0)
        printf("no answer!\n");
}
      

运行结果:

*********************************
The answer 1 is :
A:thu  |  B:mon  |  C:wed  |  D:fri  |  E:sat  |  F:tue  |  G:sun  |
*********************************
The answer 2 is :
A:thu  |  B:mon  |  C:sun  |  D:fri  |  E:sat  |  F:tue  |  G:wed  |
*********************************
The answer 3 is :
A:thu  |  B:sat  |  C:wed  |  D:fri  |  E:mon  |  F:tue  |  G:sun  |
*********************************
The answer 4 is :
A:thu  |  B:sat  |  C:sun  |  D:fri  |  E:mon  |  F:tue  |  G:wed  |          
            

8 楼


请问各位帅哥,这道题用VB该怎么编写呢?小弟课程设计急需代码,哪位大哥如能帮助小弟,小弟不胜感激.

我来回复

您尚未登录,请登录后再回复。点此登录或注册