新人学C,请大哥们帮帮忙!

时间:2021-03-12 00:23:25
小弟刚刚接触C,很多不懂~!前几天做了一道题,程序可运行,但是算出的结果总是不对,请高手们帮忙修改下,谢了~!
题目如下:
    已知一个图G和m>0种颜色,只准使用这m种颜色对G的结点着色,并使图中任何相邻的两个结点都具有不同的颜色。求在最多使用m种颜色的情况下,可以对一给定的图着色的所有不同方法。
程序如下:
#include<stdio.h>
int m,n,i,j,a=0;
int x[100]={0},G[100][100]={0};
NEXTVALUE(int k)
{
int h;
for(h=0;h<m+1;h++)
{
x[k]=(x[k]+1)%(m+1);
for(j=0;j<n;j++)
{
if(G[k][j]&&(x[k]==x[j]))
break;
}
if(j==n)
break;
}
if(j==n) return(x[k]);
if(h==m+1) return(0);
}
void MCOLORING(int k)
{
while(k<n)
{
x[k]=NEXTVALUE(k);
if(x[k]==0)
{
x[k]=m+1;
break;
}
if(k==(n-1))
{a++;
for(j=0;j<n;j++)
printf("%d",x[j]);
printf("\n");
}
else 
{
MCOLORING(k+1);
}}
}
void main()
{
printf("m=");
scanf("%d",&m);
printf("n=");
scanf("%d",&n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{printf("G[%d][%d]=",i,j);
scanf("%d",&G[i][j]);
}
MCOLORING(0);
printf("total=%d",a);
}
请高手们帮忙看下问题在哪?

16 个解决方案

#1


要枚举所有可能,
好好看看递规

#2


我还是弄不懂问题出在哪里?能直接帮我改下吗?谢谢了~!

#3


程序上传的不正规,还是书写就不好!看的累!

#4


有时间看看吧..

#5


偶也是菜鸟

  初学C语言     看不懂你的程序````   惭愧`惭愧``

#6


有时间看看

#7


说说你程序的思想好么?看了好久,不明白

#8


#include <iostream>
#include <stdlib.h>

using namespace std;
int m,n,i,j,a=0;
int x[100]={0},G[100][100]={0};
int NEXTVALUE(int k)
{
int h;
for(h=0;h<m+1;h++)
{
x[k]=(x[k]+1)%(m+1);
for(j=0;j<n;j++)
{
if(G[k][j]&&(x[k]==x[j]))
break;
}
if(j==n)
break;
}
if(j==n) return(x[k]);
if(h==m+1) return(0);
}
void MCOLORING(int k)
{
while(k<n)
{
x[k]=NEXTVALUE(k);
if(x[k]==0)
{
x[k]=m+1;
break;
}
if(k==(n-1))
{a++;
for(j=0;j<n;j++)
printf("%d",x[j]);
printf("\n");
}
else 
{
MCOLORING(k+1);
}}
}

int main(int argc, char *argv[])
{
  printf("m=");
scanf("%d",&m);
printf("n=");
scanf("%d",&n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{printf("G[%d][%d]=",i,j);
scanf("%d",&G[i][j]);
}
MCOLORING(0);
printf("total=%d",a);

  system("PAUSE");
  return 0;
}

#9


for(h=0;h<m+1;h++)
{
x[k]=(x[k]+1)%(m+1);
for(j=0;j<n;j++)
{
if(G[k][j]&&(x[k]==x[j]))
break;
}
if(j==n)
break;
}
if(j==n) return(x[k]);
if(h==m+1) return(0);


其中if(G[k][j]&&(x[k]==x[j])) 的判断条件是不行的,你只要两个相邻的格子不同。。
你的这种判断过度!!

#10


惭愧``

#11


谢谢wwxsoft(婉儿),但是你的程序不能运行,提示为:
"Parameter 'argv' is never used in function main
Parameter 'argc' is never used in function main"

#12


我程序的思想如下:
我用的是递归算法来解决,使用函数MCOLORING和NEXTVALUE。其中全局变量为使用颜色的种数m,结点的个数n,图形的布尔值GRAPH(1:n,1:n)和每个结点的赋值X[i]。
首先使用主函数调用MCOLORING(k)函数,由MCOLORING函数调用NEXTUALUE(k)函数,如果X[i]不等于0,则再由MCOLORING(k)调MCOLORING(k+1)函数,以此实现递归调用。
由用户输入颜色的数量和图G中所有结点的关系,例如:若i与j相互连结,则GRAPH[i][j]=1,否则GRAPH[i][j]=0。因为有m种颜色,所以每个结点都可以着m种颜色。
在MCOLORIG(k)中递归调用MCOLORING(k+1),并且输出每个结点着的颜色,用数组x[5]表示。在最初调用MCOLORING(0)时,应对图的邻接矩阵GRAPH[n][n]置初值并对数组x[n]置0值。
     在进入函数NEXTVALUE(k)前,假设X(1),X(2),……X(k-1)都已分得了区域[1,m]中的整数且相邻的结点有不同的整数,此函数的目的是在区域
[0,m]中给X(k)确定一个值:如果还剩下一些颜色,它们与结点k邻接的结点分配的颜色不同,那么就将其中最高标值的颜色分配给结点k;如果没剩下可用的颜色,则置X(k)为0。
在主函数中给出m,N的取值以及GRAPH(1:n,1:n)的的布尔值,并且调用MXOLORING(0)。
    
    我是初学者,还没入门,所以编写的程序不很规范,请高手们原谅,日后一定改正。

#13


但是我觉得我这样做的话,在输入G[i][j]的元素时很麻烦,而且很容易出错,请各位大虾教教我~!帮我改改程序~!
谢谢~!

#14


學習,收藏!

#15


mark

#16


四色定理,听说过,但打死我也做不出来

#1


要枚举所有可能,
好好看看递规

#2


我还是弄不懂问题出在哪里?能直接帮我改下吗?谢谢了~!

#3


程序上传的不正规,还是书写就不好!看的累!

#4


有时间看看吧..

#5


偶也是菜鸟

  初学C语言     看不懂你的程序````   惭愧`惭愧``

#6


有时间看看

#7


说说你程序的思想好么?看了好久,不明白

#8


#include <iostream>
#include <stdlib.h>

using namespace std;
int m,n,i,j,a=0;
int x[100]={0},G[100][100]={0};
int NEXTVALUE(int k)
{
int h;
for(h=0;h<m+1;h++)
{
x[k]=(x[k]+1)%(m+1);
for(j=0;j<n;j++)
{
if(G[k][j]&&(x[k]==x[j]))
break;
}
if(j==n)
break;
}
if(j==n) return(x[k]);
if(h==m+1) return(0);
}
void MCOLORING(int k)
{
while(k<n)
{
x[k]=NEXTVALUE(k);
if(x[k]==0)
{
x[k]=m+1;
break;
}
if(k==(n-1))
{a++;
for(j=0;j<n;j++)
printf("%d",x[j]);
printf("\n");
}
else 
{
MCOLORING(k+1);
}}
}

int main(int argc, char *argv[])
{
  printf("m=");
scanf("%d",&m);
printf("n=");
scanf("%d",&n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{printf("G[%d][%d]=",i,j);
scanf("%d",&G[i][j]);
}
MCOLORING(0);
printf("total=%d",a);

  system("PAUSE");
  return 0;
}

#9


for(h=0;h<m+1;h++)
{
x[k]=(x[k]+1)%(m+1);
for(j=0;j<n;j++)
{
if(G[k][j]&&(x[k]==x[j]))
break;
}
if(j==n)
break;
}
if(j==n) return(x[k]);
if(h==m+1) return(0);


其中if(G[k][j]&&(x[k]==x[j])) 的判断条件是不行的,你只要两个相邻的格子不同。。
你的这种判断过度!!

#10


惭愧``

#11


谢谢wwxsoft(婉儿),但是你的程序不能运行,提示为:
"Parameter 'argv' is never used in function main
Parameter 'argc' is never used in function main"

#12


我程序的思想如下:
我用的是递归算法来解决,使用函数MCOLORING和NEXTVALUE。其中全局变量为使用颜色的种数m,结点的个数n,图形的布尔值GRAPH(1:n,1:n)和每个结点的赋值X[i]。
首先使用主函数调用MCOLORING(k)函数,由MCOLORING函数调用NEXTUALUE(k)函数,如果X[i]不等于0,则再由MCOLORING(k)调MCOLORING(k+1)函数,以此实现递归调用。
由用户输入颜色的数量和图G中所有结点的关系,例如:若i与j相互连结,则GRAPH[i][j]=1,否则GRAPH[i][j]=0。因为有m种颜色,所以每个结点都可以着m种颜色。
在MCOLORIG(k)中递归调用MCOLORING(k+1),并且输出每个结点着的颜色,用数组x[5]表示。在最初调用MCOLORING(0)时,应对图的邻接矩阵GRAPH[n][n]置初值并对数组x[n]置0值。
     在进入函数NEXTVALUE(k)前,假设X(1),X(2),……X(k-1)都已分得了区域[1,m]中的整数且相邻的结点有不同的整数,此函数的目的是在区域
[0,m]中给X(k)确定一个值:如果还剩下一些颜色,它们与结点k邻接的结点分配的颜色不同,那么就将其中最高标值的颜色分配给结点k;如果没剩下可用的颜色,则置X(k)为0。
在主函数中给出m,N的取值以及GRAPH(1:n,1:n)的的布尔值,并且调用MXOLORING(0)。
    
    我是初学者,还没入门,所以编写的程序不很规范,请高手们原谅,日后一定改正。

#13


但是我觉得我这样做的话,在输入G[i][j]的元素时很麻烦,而且很容易出错,请各位大虾教教我~!帮我改改程序~!
谢谢~!

#14


學習,收藏!

#15


mark

#16


四色定理,听说过,但打死我也做不出来