软件设计师模拟试题
#include "stdio.h"
#define k 15 /*假定数组有15个数*/
char a[k]={'r','w','b','r','r','b','w','w','b','b','b','w','r','r','w'}; /*r,b,w代表红,蓝,白*/
main()
{int i,ii;
char t;
int m,n,p;
m=0; /*m为红色末尾指针*/
n=0; /*n为白色末尾指针*/
p=14;/*p为蓝红色头指针*/
for (ii=0;ii<15;ii++)
printf("%c",a[ii]);
while(n<=p)
{
if (a[n]=='r') {t=a[n];a[n]=a[m];a[m]=t;m++;n++;}
else if (a[n]=='w') n++;
else {
t=a[n];a[n]=a[p];a[p]=t;p--;n++;
if (a[n-1]=='r') {t=a[n-1];a[n-1]=a[m];a[m]=t;m++;}
}
for (i=0;i<15;i++)
prinrf("%s",a[n]);
}
货郎问题????
一笔画问题
const max=6;{顶点数为6}
type shuzu=array[1..max,1..max]of 0..max;
const a:shuzu {图的描述与定义 1:连通;0:不通}
=((0,1,0,1,1,1),
(1,0,1,0,1,0),
(0,1,0,1,1,1),
(1,0,1,0,1,1),
(1,1,1,1,0,0),
(1,0,1,1,0,0));
var
bianshu:array[1..max]of 0..max; {与每一条边相连的边数}
path:array[0..1000]of integer; {记录画法,只记录顶点}
zongbianshu,ii,first,i,total:integer;
procedure output(dep:integer); {输出各个顶点的画法顺序}
var sum,i,j:integer;
begin
inc(total);
writeln('total:',total);
for i:=0 to dep do write(Path);writeln;
end;
function ok(now,i:integer;var next:integer):boolean;{判断第I条连接边是否已行过}
var j,jj:integer;
begin
j:=0; jj:=0;
while jj<>i do begin inc(j);if a[now,j]<>0 then inc(jj);end;
next:=j;
{判断当前顶点的第I条连接边的另一端是哪个顶点,找出后赋给NEXT传回}
ok:=true;
if (a[now,j]<>1) then ok:=false; {A[I,J]=0:原本不通}
end; { =2:曾走过}
procedure init; {初始化}
var i,j :integer;
begin
total:=0; {方案总数}
zongbianshu:=0; {总边数}
for i:=1 to max do
for j:=1 to max do
if a[i,j]<>0 then begin inc(bianshu);inc(zongbianshu);end;
{求与每一边连接的边数bianshu}
zongbianshu:=zongbianshu div 2; {图中的总边数}
end;
procedure find(dep,nowpoint:integer); {dep:画第几条边;nowpoint:现在所处的顶点}
var i,next,j:integer;
begin
for i:=1 to bianshu[nowpoint] do {与当前顶点有多少条相接,则有多少种走法}
if ok(nowpoint,i,next) then begin {与当前顶点相接的第I条边可行吗?}
{如果可行,其求出另一端点是NEXT}
a[nowpoint,next]:=2; a[next,nowpoint]:=2; {置成已走过标志}
path[dep]:=next; {记录顶点,方便输出}
if dep < zongbianshu then find(dep+1,next) {未搜索完每一条边}