注册 登录
编程论坛 C++教室

求助!!关于穷举

ashencs 发布于 2007-06-28 21:21, 1017 次点击
关于解决楼层分配问题
现有五层的公寓分配给A、B、C、D、E五个人住。其中A不住1楼,B不住5楼,C和D住上下楼(可以C比D住的高,也可以D比C住的高),E比C住的高。
char name[]={'A','B','C','D','E'};
int i,value[5];
for(value[0]=1;value[0]<6;value[0]++)
for(value[1]=1;value[1]<6;value[1]++)
for(value[2]=1;value[2]<6;value[2]++)
for(value[3]=1;value[3]<6;value[3]++)
for(value[4]=1;value[4]<6;value[4]++)
{
if((value[0]>1)
&&(value[1]<5)
&&(value[2]==value[3]+1)
&&(value[3]==value[2]+1)
&&(value[4]>value[2]))
for(i=0;i<5;i++)
编到这之后然后怎么编?不会了 求各位帮帮忙,谢谢拉!!!
不知道之前的对不
10 回复
#2
ashencs2007-06-28 21:27
还有 编写多个函数分别实现上述功能,再能提醒一下吗,谢谢!
#3
ashencs2007-06-29 12:06
怎么没人?
。。。。。。。。。。。。。。
#4
aipb20072007-06-29 12:22
直接输出就好,你是模仿的那个置顶题目吧?
很好,不过你有个错误,cd上下楼,你那里条件c=d+1 d=c+1应该是或关系不是与关系。
我在你代码基础上改了下,你参照,不过一定要读懂。

#include <iostream>
using namespace std;
//现有五层的公寓分配给A、B、C、D、E五个人住。其中A不住1楼,B不住5楼,
//C和D住上下楼(可以C比D住的高,也可以D比C住的高),E比C住的高。

int main(){
char name[]={'A','B','C','D','E'};
int i,value[5];
for(value[0]=1;value[0]<6;value[0]++)
for(value[1]=1;value[1]<6;value[1]++)
for(value[2]=1;value[2]<6;value[2]++)
for(value[3]=1;value[3]<6;value[3]++)
for(value[4]=1;value[4]<6;value[4]++)
{
if((value[0]>1)
&&(value[1]<5)
&&((value[2]==value[3]+1) || (value[3]==value[2]+1))
&&(value[4]>value[2])){
for(i=0;i<5;i++)
cout << name[i] << " " << value[i] << " ";
cout << endl;
}
}

system("pause");
}

[此贴子已经被作者于2007-6-29 19:27:43编辑过]

#5
ashencs2007-06-29 19:03

谢谢斑竹拉!!

#6
ashencs2007-06-30 18:02

回去试了下发现没考虑同在一层楼问题。
考虑不可以住在同一层楼的条件难不成是这样?
(value[0]!=value[1]&&value[0]!=value[2]&&value[0]!=value[3]&&value[0]!=value[4]&&value[1]!=value[2]&&value[1]!=value[3]&&value[1]!=value[4]&&value[2]!=value[3]&&value[2]!=value[4]&&value[3]!=value[4])
有没有简单点的
还有可以帮我整个改成多函数调用的形式吗,没学过函数调用

#7
天空の城2007-07-01 14:04
..........
for(value[4]=1;value[4]<6;value[4]++)
{
//________begin______// 增加判断相同楼层的情况!
map<int,int>mp;
for(i=0;i<5;i++)
mp[value[i]]++;
bool b=true;
for(i=0;i<5;i++)
b=b&&(!(mp[i+1]-1));
if(b)
//________end________//
if((value[0]>1)
....
}
#8
天空の城2007-07-01 19:14

#include <iostream>
#include <algorithm>
using namespace std;


void main()
{
    int a[]={1,2,3,4,5};
    char floor[]={'A','B','C','D','E'};
    do
    {
        if((a[0]>1) && (a[1]<5) && (a[4]>a[2]) &&
            ((a[2]==a[3]+1)||(a[3]==a[2]+1)))
        {
            for(int i=0;i<5;i++)
                cout << floor[i] << \" \" << a[i] << \"   \";
            cout << endl;
        }
    }while(next_permutation(a,a+5));
}

#9
天空の城2007-07-01 19:21

如果非要你老师说的那样,就象下面这样写吧!


#include <iostream>
#include <map>
#include <algorithm>
using namespace std;


                     
void Floor1()
{
    char name[]={'A','B','C','D','E'};
    int i,value[5];
    for(value[0]=1;value[0]<6;value[0]++)
        for(value[1]=1;value[1]<6;value[1]++)
            for(value[2]=1;value[2]<6;value[2]++)
                for(value[3]=1;value[3]<6;value[3]++)
                    for(value[4]=1;value[4]<6;value[4]++)
                    {
                        map<int,int>mp;
                        for(i=0;i<5;i++)
                            mp[value[i]]++;
                        bool b=true;
                        for(i=0;i<5;i++)
                            b=b&&(!(mp[i+1]-1));
                        if(b)
                            if((value[0]>1) &&(value[1]<5) &&((value[2]==value[3]+1) || (value[3]==value[2]+1))
                                &&(value[4]>value[2]))
                            {
                                for(i=0;i<5;i++)
                                    cout << name[i] << \" \" << value[i] << \"   \";
                                cout << endl;
                            }
                    }
}
void Floor2()
{
    int a[]={1,2,3,4,5};
    char floor[]={'A','B','C','D','E'};
    do
    {
        if((a[0]>1) && (a[1]<5) && (a[4]>a[2]) &&
            ((a[2]==a[3]+1)||(a[3]==a[2]+1)))
        {
            for(int i=0;i<5;i++)
                cout << floor[i] << \" \" << a[i] << \"   \";
            cout << endl;
        }
    }while(next_permutation(a,a+5));
}


void main()
{
    cout<<\"调用第一种方法获取楼层分配方案!\"<<endl;
    Floor1();
    cout<<\"调用第二种方法获取楼层分配方案!\"<<endl;
    Floor2();
}

#10
terisevend2007-07-01 20:09
第二种方案懂得,第一种方案中的判断是否相等读不懂。。。望赐教。。。
#11
ashencs2007-07-01 22:38

恩,还好,谢谢!
应付老师越简单越好,我这样觉的。这样就好了,回去我再去点东西,能出结果就行。

1