(程序5说明)
著名的四色定理指出任何平面区域图均可用四种颜色着色,使相邻区域着不同的颜色。本程序对给定的区域图找出所有可能的不超过四种颜色的着色方案。
程序中用1~4表示四种颜色。要着色的N个区域用0~N-1编号,区域相邻关系用 adj[][]矩阵表示,矩阵的i行j列的元素为1,表示区域i与区域j相邻;矩阵的i行j列的元素为0,表示区域i与区域j不相邻。数组color[]用来存储着色结果,color[i]的值为区域i所着颜色。
(程序5)
include<stdio.h>
define N 10
void output(int color[])/*输出一种着色方案*/
{ int i;
for(i=0;i<N;i++)
printf("%4d",color[i]);
printf("/n");
}
int back (int * ip,int color[])/*回溯*/
{ int c=4;
while(c==4){
if(*ip<=0)return 0;
--(*ip);
c=(1);
color[*ip]=-1;
}
return c;
}
/*检查区域i,对c种颜色的可用性*/
int colorOk(int i,int c,int [][N],int color[]}
{ int j;
for(j=0;j<i;j++)
if((2))
return 0;
return 1;
}
/*为区域i选一种可着的颜色*/
int select (int i,int c,int adj[][N],int color[])
{ int k;
for(k=c;k<=4;k++)
if(colorOK((3)))
return k;
return 0;
}
int coloring(int adj[][N])/*寻找各种着色方案*/
{ int color[N],i,c,cnt;
for(i=0;i<N;i++)color[i] =-1;
i=c=0;cnt=0;
while(1){
if((c=(4))==0){
c=back(&i,color);
if(c==0)return cnt;
}else{(5);i++;
if(i==N){
output(color);
++cnt;
c=back(&i,color);
}else c=0;
}
}
}
void main()
{ int adj[N][N]=
{{0,1,0,1,1,1,1,1,1,1},
{1,0,1,1,0,1,1,1,1,0},
{0,1,0,1,0,1,1,0,1,1},
{1,1,1,0,1,1,0,0,1,1},
{1,0,0,1,0,1,0,0,0,0},
{1,1,1,1,1,0,1,0,0,1},
{1,1,1,0,0,1,0,0,1,0},
{1,1,0,0,0,0,0,0,1,1},
{1,1,1,1,0,0,1,1,0,1},
{1,0,1,1,0,1,0,1,1,0}
};
printf("共有%d组解./n",coloring(adj));
}
[试题]阅读下列程序说明和C代码,将应填入(n)处的字句写在对应栏内。(程序说明)著名的四色定理指出任何平面区域图均可用4种颜色着色,使相邻区域着不同的颜色。本程序对给定的区域图找出所有可能的不超过4种颜色的着色方案。程序中用1~4表示4种颜色。要着色的N个区域用0~N-1编号,区域相邻关系用adj[][]矩阵表示,矩阵的i行j列的元素为1,表示区域i与区域j相邻:矩阵的i行j列的元素为0,表示区域i与区域j不相邻。数组color[]用来存储着色结果,color[i]的值为区域i所着颜色。(程序)incl
[主观题]阅读下列程序说明和C++代码,将应填入(n)处。(说明)“背包问题”的基本描述是:有一个背包,能盛放的物品总重量为S,设有N件物品,其重量分别为w1;w2,……,wn,希望从N件物品中选择若干件物品,所选物品的重量之和恰能放入该背包,即所选物品的重量之和等于S。如下程序均能求得“背包问题”的一组解,其中程序4.1是“背包问题”的递归解法,而程序4.2是“背包问题”的非递归解法。(程序4.1)include<stdio.h>define N 7define S 15int w[N+1]={0,1,
[试题]阅读下列程序说明和C代码,将应填入(n)处的字句写在对应栏内。(说明)“背包问题”的基本描述是:有一个背包,能盛放的物品总重量为S,设有N件物品,其重量分别为w1,w2,…,wn。希望从N件物品中选择若干件物品,所选物品的重量之和恰能放入该背包,即所选物品的重量之和等于S。如下程序均能求得“背包问题”的一组解,其中程序1是“背包问题”的递归解法,而程序2是“背包问题”的非递归解法。(程序1)include<stdio.h>define N 7define S 15int w[N+1]={0,1,4
[试题]阅读下列程序说明和C代码,将应填入(n)处的字句写在对应栏内。[说明]函数Printprime(int UpBound)的功能是输出1到UpBound以内的全体素数。[函数2.1]void PrintPrime(int UpBound)printf("2," );for(i=3; i<UpBound; i+ =2) {int k = sqrt(i);for(j=3; j<= k;(1)) /*检查i是否有3到k以入的奇因数*/if((2)) break;fi((3)) printf("%d
[试题]阅读下列程序说明和C代码,将应填人(n)处的字句写在对应栏内。[程序5说明]下列文法可用来描述化学分子式的书写规则(例如,A12(CO3)3”Cu(OH)2):λ→β/βλβ→δ/δnδ→ξ/ξθ/(λ)其中:λ是—个分子式;δ或是一个元素,或是一个带括号的(子)分子式,元素或是一个大写字母(记为ξ),或是一个大写字母和一个小写字母(记为ξθ)β或是一个δ,或是在δ之后接上一个整数n,δn表示β有n个δ的元素或(子)分子式。—个完整的分子式由若干个β组成。当然一个正确的分子式除符合上述文法规则外,
[试题]试题四阅读下列程序说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。(说明)本程序从若干个原始文件合并成的合并文件中恢复出其中一个或全部原始文件。所有文件均作为二进制文件进行处理。合并文件中先顺序存储各原始文件,然后顺序存储各原始文件的控制信息,即文件名、文件长度和在合并文件中的位置(偏移量 )。其结构为:typedef struct{char fname [256]/*原始文件名*/long length;/*原始文件长度(字节数)*/long offset;/*原始文件在合并文件中的位
[试题]试题四阅读下列程序说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。(程序4.1说明)"背包问题"的基本描述是:有一个背包,能盛放的物品总重量为S,设有N件物品,其重量分别为w1,w2,..,wn,希望从N件物品中选择若干件物品,所选物品的重量之和恰能放入该背包,即所选物品的重量之和等于S。如下程序均能求得"背包问题"的一组解,其中程序4.1是"背包问题"的递归解法,而程序4.2是"背包问题"的非递归解法。(程序4.1)#include<stdio.h>#def
[试题]阅读下列程序说明和C代码,将应填入(n)处的字句写在对应栏内。(说明)设M叉树采用列表法表示,即每棵子树对应一个列表,列表的结构为:子树根节点的值部分(设为一个字符)和用“()”,括起来的各子树的列表(如有子树的话),各子列表间用“,”分隔。例如下面的三叉树可用列表a(b(c,d),e,f(g,h,i))表示。本程序输入列表,生成一棵M叉树,并由M叉树输出列表。假定输入无错误。(函数5-8)inelude<stdio.h>include<stdlib.h>define M3typedef stru
[试题]阅读下列程序说明和C代码,将应填入(n)处的字句写在对应栏内。(说明)设某城市有n个车站,并有m条公交线路连接这些车站,设这些公交车都是单向的,这n个车站被顺序编号为0至n-1。输入该城市的公交线路数、车站个数,以及各公交线路上的各站编号,求得从站0出发乘公交车至站n-1的最少换车次数。程序利用输入信息构建一张有向图G(用邻接矩阵g表示),有向图的顶点是车站,若有某条公交线路经i站能到达j站,就在顶点i到顶点j之间设置一条权为1的有向边<i,j>。如是这样,从站点x至站点y的最少上车次数便对应图G
[主观题]阅读以下说明和C代码,将应填入(n)处的字句写在对应栏内。[说明]下面程序用来将打乱的单词还原为原来的次序,比如将rty还原为try。单词的原来次序存储于wordlist.txt文件中,原则上可用穷举法(rty对应的穷举为:rty、ryt、try、tyr、ytr、yrt),但考虑到破译速度,采用如下方法。注意到单词列表中不存在组成字符完全相同的单词(如Hack12与Hack21包含完全相同的字符),因此将单词中的字符进行重组再进行比较,例如,try单词重组为rty(按ASCⅡ码顺序),这样不管打