【菜鸟菜问】地图着色问题

lzero13199 2009-06-17 01:10:13
下面是一段关于地图着色的代码
检查了几遍 觉得运行出来怎么都不对
#include <stdio.h>
#define N 21
void color(int metro[N][N],int r_color[N],int sum)
{
int i,j,k;
for(i=1;i<=sum;i++)
for(j=1;j<=4;j++)
{
r_color[i]=j;/*尝试着色*/
for(k=1;k<i;k++)
if(metro[i][k]==1&&r_color[k]==r_color[i])
break;
if(k>=i) break;
}
}

void main()
{
int r_color[N]={0};
int i;
int metro[N][N]={{1},/*邻接矩阵*/
{0,1,1,1,1,1,1},
{0,1,1,1,1},
{0,1,1,1,0,0,1},
{0,1,1,0,1,1},
{0,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0,1},
{0,1,0,1,0,1,1,1,1,1},
{0,0,0,0,0,0,1,1,1},
{0,0,0,0,0,0,1,1,1,1,0,0,1},
{0,0,0,0,0,1,1,0,1,1,0,0,1,1,1,0,1},
{0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,1,0,0,0,1},
{0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,1},
{0,0,0,0,0,0,0,0,1,1,0,1,1,1,0,0,0,0,0,1,1},
{0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1},
{0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1},
{0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,1,1,1,0,1},
{0,0,0,0,1,0,0,0,1,0,0,0,0,1,1,1,1},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1},
{0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0,1,1,1},
{0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1}};
color(metro,r_color,20);
printf("\n");
for(i=1;i<=20;i++)/*输出着色方案*/
printf("the r_color[%d] is %d\n",i,r_color[i]);//每个节点的颜色
}
运行结果是1,2,3,3,2,4。。。。
显然不对啊 明显第三区域和第四区域是相邻的,怎么能用一种颜色着色呢?可是程序明明是没有问题的啊?
还请大虾指教!
...全文
110 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lzero13199 2009-06-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 findcsdn 的回复:]

所有数组是从[0]开始的不是[1],应该就是这个问题。


C/C++ code

#include <stdio.h>

#define N 21

void color(int metro[N][N], int r_color[N],int sum)
{
int i,j,k;
for(i=0; i<sum; i++)
{
for(j=1; j<5; j++)
{
r_color[i]=j; /*尝试着色*/
for(k=0; k<i; k++)
{
if((metro[i][k]==1) &…
[/Quote]
能讲讲为什么这么改吗?
findcsdn 2009-06-17
  • 打赏
  • 举报
回复

所有数组是从[0]开始的不是[1],应该就是这个问题。



#include <stdio.h>

#define N 21

void color(int metro[N][N], int r_color[N],int sum)
{
int i,j,k;
for(i=0; i<sum; i++)
{
for(j=1; j<5; j++)
{
r_color[i]=j; /*尝试着色*/
for(k=0; k<i; k++)
{
if((metro[i][k]==1) && (r_color[k]==r_color[i]))
break;
}
if(k>=i) break;
}
}
}

void main()
{
int r_color[N]={0};
int i;
int metro[N][N]={ {1},
{0,1,1,1,1,1,1},
{0,1,1,1,1},
{0,1,1,1,0,0,1},
{0,1,1,0,1,1},
{0,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0,1},
{0,1,0,1,0,1,1,1,1,1},
{0,0,0,0,0,0,1,1,1},
{0,0,0,0,0,0,1,1,1,1,0,0,1},
{0,0,0,0,0,1,1,0,1,1,0,0,1,1,1,0,1},
{0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,1,0,0,0,1},
{0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,1},
{0,0,0,0,0,0,0,0,1,1,0,1,1,1,0,0,0,0,0,1,1},
{0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1},
{0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1},
{0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,1,1,1,0,1},
{0,0,0,0,1,0,0,0,1,0,0,0,0,1,1,1,1},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1},
{0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0,1,1,1},
{0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1}};
color(metro,r_color,N);
printf("\n");
for(i=0;i<N;i++)/*输出着色方案*/
printf("the r_color[%d] is %d\n",i,r_color[i]);//每个节点的颜色
}


ameyume 2009-06-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ameyume 的回复:]
for(k=1;k <i;k++)
if(metro[i][k]==1&&r_color[k]==r_color[i])
break;
if(k>=i) break;

for没加大括号,管的范围只到第一个if
有问题吧?
[/Quote]
sorry
好像没问题
ameyume 2009-06-17
  • 打赏
  • 举报
回复
for(k=1;k <i;k++)
if(metro[i][k]==1&&r_color[k]==r_color[i])
break;
if(k>=i) break;

for没加大括号,管的范围只到第一个if
有问题吧?
ameyume 2009-06-17
  • 打赏
  • 举报
回复
先顶再看
findcsdn 2009-06-17
  • 打赏
  • 举报
回复
很有意思的题目!

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧