Ccoops 2023-04-04 18:18 采纳率: 100%
浏览 21
已结题

c++的染色问题纠错


#include <iostream>

using namespace std;

typedef struct Etype
{
    int number;
    int color;
}Etype;

typedef struct stack
{
    Etype*element;
    int top;
    int Maxsize;
}stack;

void creat(stack&L,int maxsize)
{
    L.Maxsize=maxsize;
    L.element=new Etype[L.Maxsize];
    L.top=-1;
}

bool isempty(stack&L)
{
    if(L.top==-1) return 1;
    return 0;
}

bool isfull(stack&L)
{
    if(L.top>=L.Maxsize-1) return 1;
    return 0;
}

bool push(stack&L,Etype&x)
{
    if(isfull(L)) return 0;
    else
    {
        L.top++; 
        L.element[L.top]=x;
        return 1;
    }
}

bool pop(stack&L,Etype&x)
{
    if(isempty(L)) return 0;
    else
    {
        x=L.element[L.top];
        L.top--;
        return 1;
    }
}

void output(stack&L)
{
    Etype x;
    while(!isempty(L))
    {
        pop(L,x);
        cout<<"     "<<x.number<<"                "<<x.color;
        cout<<endl;
    }
}

void matchcolor(int n,int s[4][4],int sum)
{
    stack L,Lkeep;                    //Lkeep用于储存中转数组 
    Etype g,db,dl;                    //g用于储存新的数据,db用于取出L中原有数据进行对比,dl用于该位数据无法成立后取出上位数据 
    int num=0;                        //num用于标记地域 
    int tc=0;                         //tc用于标记上一次循环时g是否放入 
    int col;
    g.number=num;
    g.color=col;
    push(L,g);
    num++;
    while(num<=sum-1&&num>=0)
    {
        if(tc)
        {
            num--;
            col=dl.color+1;           //返回上位数据,且颜色初值加1 
            tc=0;
        }
        else
        {
            col=1;
        }
        g.number=num;
        g.color=col;
        while(!isempty(L)&&g.color<=n)
        {
            pop(L,db);                          //一位一位取出进行对比 
            push(Lkeep,db);
            if(s[db.number][g.number]&&(db.color==g.color))
            {
                g.color++;
                while(!isempty(Lkeep))
                {
                    pop(Lkeep,db);
                    push(L,db);
                }                                 //颜色加1,且原L重置,进行重新对比 
                    
            }
        }
        if(g.color>n)                             //所有颜色取完该位依旧无解 
        {
            tc=1;
            while(!isempty(Lkeep))
            {
                pop(Lkeep,db);
                push(L,db);
            }
            pop(L,dl);                           //取出上位元素 
        }
        else
        {
            while(!isempty(Lkeep))
            {
                pop(Lkeep,db);
                push(L,db);
            }
            push(L,g);
            num++;                              //有解则重置L,且将新元素放入其中 
        }
    }
    if(num==sum) 
    {
        output(L);
    }
}

int main()
{
    int sum=4;
    int n=4;
    int s[4][4]={{0,1,0,0},{1,0,1,0},{0,1,0,0},{0,0,0,0}};
    matchcolor(n,s,sum);
    return 0;
}

能帮我看看为什么这段代码处理染色问题始终没有输出吗?
自己看了好久
return的数也有问题

  • 写回答

2条回答 默认 最新

  • Dummer25 2023-04-06 16:05
    关注

    可以发现问题出在 Etype g, db, dl; 和 g.color=col; 这两行代码处。

    在使用 g 时,没有对其进行初始化赋值。因此在第一次判断 if(s[db.number][g.number]&&(db.color==g.color)) 时,g.color 的值为未知状态,因此无法得到正确结果。

    修改方式: 在第 16 行处加入 g.number=-1; g.color=0; 进行初始化赋值,避免使用未知状态的 g。

    另外,在第 44 行处,g.color <= n 条件判断应该改为 g.color < n,因为颜色编号是从 1 开始的。

    修改后的代码如下:

    #include <iostream>
     
    using namespace std;
     
    typedef struct Etype
    {
        int number;
        int color;
    } Etype;
     
    typedef struct stack
    {
        Etype* element;
        int top;
        int Maxsize;
    } stack;
     
    void creat(stack& L, int maxsize)
    {
        L.Maxsize = maxsize;
        L.element = new Etype[L.Maxsize];
        L.top = -1;
    }
     
    bool isempty(stack& L)
    {
        if (L.top == -1) {
            return true;
        }
        return false;
    }
     
    bool isfull(stack& L)
    {
        if (L.top >= L.Maxsize - 1) {
            return true;
        }
        return false;
    }
     
    bool push(stack& L, Etype& x)
    {
        if (isfull(L)) {
            return false;
        }
        L.top++;
        L.element[L.top] = x;
        return true;
    }
     
    bool pop(stack& L, Etype& x)
    {
        if (isempty(L)) {
            return false;
        }
        x = L.element[L.top];
        L.top--;
        return true;
    }
     
    void output(stack& L)
    {
        Etype x;
        while (!isempty(L))
        {
            pop(L, x);
            cout << "     " << x.number + 1 << "                " << x.color << endl;
        }
    }
     
    void matchcolor(int n, int s[4][4], int sum)
    {
        stack L, Lkeep;                    //Lkeep用于储存中转数组 
        Etype g, db, dl;                   //g用于储存新的数据,db用于取出L中原有数据进行对比,dl用于该位数据无法成立后取出上位数据 
        creat(L, 100);
        creat(Lkeep, 100);
        g.number = -1;
        g.color = 0;
        push(L, g);
        int num = 0;                        //num用于标记地域 
        int tc = 0;                         //tc用于标记上一次循环时g是否放入 
        int col;
        while (num <= sum - 1 && num >= 0)
        {
            if (tc)
            {
                num--;
                col = dl.color + 1;           //返回上位数据,且颜色初值加1 
                tc = 0;
            }
            else
            {
                col = 1;
            }
            g.number = num;
            g.color = col;
            while (!isempty(L) && g.color < n)
            {
                pop(L, db);                          //一位一位取出进行对比 
                push(Lkeep, db);
                if (s[db.number][g.number] && (db.color == g.color))
                {
                    g.color++;
                    while (!isempty(Lkeep))
                    {
                        pop(Lkeep, db);
                        push(L, db);
                    }                                 //颜色加1,且原L重置,进行重新对比 
                       
                }
            }
            if (g.color >= n)                             //所有颜色取完该位依旧无解 
            {
                tc = 1;
                while (!isempty(Lkeep))
                {
                    pop(Lkeep, db);
                    push(L, db);
                }
                pop(L, dl);                           //取出上位元素 
            }
            else
            {
                while (!isempty(Lkeep))
                {
                    pop(Lkeep, db);
                    push(L, db);
                }
                push(L, g);
                num++;                              //有解则重置L,且将新元素放入其中 
            }
        }
        if (num == sum)
        {
            output(L);
        }
    }
     
    int main()
    {
        int sum = 4;
        int n = 4;
        int s[4][4]= { {0, 1, 0, 0}, {1, 0, 1, 0}, {0, 1, 0, 0}, {0, 0, 0, 0} };
        matchcolor(n, s, sum);
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月21日
  • 已采纳回答 4月13日
  • 创建了问题 4月4日

悬赏问题

  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等
  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
  • ¥15 神经网络怎么把隐含层变量融合到损失函数中?
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行
  • ¥20 测距传感器数据手册i2c