主题:讨论一道轮休的程序题....各抒己见!!
chdbj
[专家分:860] 发布于 2005-07-16 21:16:00
下午看了个算法题:
题目如下:
//安排轮休.
//某公司有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个回复)
沙发
cwbcxy [专家分:20] 发布于 2005-07-17 11:47:00
符号很多不规范
仔细检查
有些问题是由于细节引起的
虽然没有错误显示
板凳
飘渺孤鸿 [专家分:60] 发布于 2005-07-17 13:07:00
逻辑关系出现错误
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 楼
XVenus [专家分:20] 发布于 2005-07-19 22:20:00
这是不是就是一道枚举题呀?
http://www.programfan.com/club/showbbs.asp?id=90952
和这道差不多?
4 楼
davidw017 [专家分:4170] 发布于 2005-07-20 11:06:00
// 我用 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 楼
sunnyfish [专家分:250] 发布于 2005-07-27 13:15:00
细节问题,常常会导致出错的啊!
我竞赛的时候解决一题很简单的题目,由于细节问题,耗了我好多时间,比如逻辑关系什么的,好像你上面的问题啊!
6 楼
wjp2005 [专家分:0] 发布于 2005-09-26 00:07:00
#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 楼
jackin0627 [专家分:1270] 发布于 2005-09-27 14:54:00
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 楼
haiwulong223 [专家分:0] 发布于 2006-07-02 16:22:00
请问各位帅哥,这道题用VB该怎么编写呢?小弟课程设计急需代码,哪位大哥如能帮助小弟,小弟不胜感激.
我来回复