四、调试分析
1.首先使用了《离散数学》的解决方法,但在测试中国地图中出错,因为排序
并不能解决递归调用的问题,后来省掉了排序,在使用开始那个例子时,第
8 个区域不能着色,因此,改采用递归的方法
2.算法的时间复杂度为 O(N),空间复杂度为 O(N*N);
3.通过本次试验,我认识到采用递归方法比较快捷,实现方便
五、程序代码
#include
#define MAX 50
int total;
int lin[MAX][MAX];
int color[MAX];
void draw();
int okcyq(int dep,int i,int x)
{
int k;
for(k=x;k<=dep;k++)
{
if(lin[dep][k]==1 && i==color[k])return(0);
if(!okcyq(dep,i,k+1)&&k==dep)return(1);
}
return(0);
}
void output()
{
int k;
for(k=1;k<=total;k++)
printf("%d ",color[k]);
}
{
void find(int dep)
int i;
for(i=1;i<=4;i++)
{
if(okcyq(dep,i,1))
{
color[dep]=i;
if(dep==total) {output();getch();draw();exit(1);}
else find(dep+1);
color[dep]=0;
}
}
}
{
void draw()
int gdriver,gmode;
int x=1,y=1,dx,dy,dx2,dy2,i=1;
char dot,draw;
gdriver=DETECT;
initgraph(&gdriver,&gmode,"");
cleardevice();
setbkcolor(BLACK);
while((dot=getch())!='q')
{
{
line(1,440,639,440);
switch(dot)
case 'a':
setviewport(1,441,639,479,BLUE);
clearviewport();
outtextxy(1,2,"Press 'b' to end, then Press 'q' to quit");
setviewport(1,1,639,439,BLUE);
moveto(x,y);
while((draw=getch())!='b')
{
switch(draw)
{
case
77:x=(getx()+1)%639;y=gety();moveto(x,y);putpixel(x,y,RED);break;
case
75:x=getx()-1;y=gety();moveto(x,y);putpixel(x,y,RED);break;
case
72:x=getx();y=gety()-1;moveto(x,y);putpixel(x,y,RED);break;
case
80:x=getx();y=(gety()+1)%439;moveto(x,y);putpixel(x,y,RED);break;
}
}
break;
default:
setviewport(1,441,639,479,BLUE);
clearviewport();
outtextxy(1,2,"Press 'e' to end, then Press 'q' to quit");
setviewport(1,1,639,439,BLUE);
moveto(x,y);
while((draw=getch())!='e')
{
switch(draw)
{
case
77:x=(getx()+1)%639;y=gety();putpixel(getx(),gety(),getpixel(x,y))
;moveto(x,y);putpixel(x,y,YELLOW);break;
case
75:x=getx()-1;if(x==0)x=639;y=gety();putpixel(getx(),gety(),getpi
xel(x,y));moveto(x,y);putpixel(x,y,YELLOW);break;
case
72:x=getx();y=gety()-1;if(y==0)y=439;putpixel(getx(),gety(),getpi
xel(x,y));moveto(x,y);putpixel(x,y,YELLOW);break;
case
80:x=getx();y=(gety()+1)%439;putpixel(getx(),gety(),getpixel(x,y))
;moveto(x,y);putpixel(x,y,YELLOW);break;
}
}
}
}
setviewport(1,441,639,479,BLUE);
clearviewport();
outtextxy(1,2,"Press 'e' to end, then Press 'q' to quit");
setviewport(1,1,639,439,BLUE);
moveto(x,y);
while((dot=getch())!='q')
{
switch(dot)
{
case
77:x=(getx()+1)%639;y=gety();putpixel(getx(),gety(),getpixel(x,y))
;moveto(x,y);putpixel(x,y,YELLOW);break;
case
75:x=getx()-1;if(x==0)x=639;y=gety();putpixel(getx(),gety(),getpi
xel(x,y));moveto(x,y);putpixel(x,y,YELLOW);break;
case
72:x=getx();y=gety()-1;if(y==0)y=439;putpixel(getx(),gety(),getpi
xel(x,y));moveto(x,y);putpixel(x,y,YELLOW);break;
case
80:x=getx();y=(gety()+1)%439;putpixel(getx(),gety(),getpixel(x,y))
;moveto(x,y);putpixel(x,y,YELLOW);break;
case 13:
dx=x;dy=y;
while(1)
if(getpixel(dx,dy)!=RED)
dx--;
else break;
dx2=dx;
dx=x;
while(1)
{
if(getpixel(dx,dy)!=RED)
dx++;
else break;
setcolor(color[i]);
line(dx2+1,dy,dx-1,dy);
dx=x;
while(1)
if(getpixel(dx,dy)!=RED)
dy--;
else break;
dy2=dy;
dy=y;
while(1)
{
if(getpixel(dx,dy)!=RED)
dy++;
else break;
{
}
}
{
}
}
setcolor(color[i]);
line(dx,dy2+1,dx,dy-1);
break;
case 'k':i++;
}
}
closegraph();
}
void main()
{
int i,j,sp,ep;
char c;
clrscr();