地圖4色演算法
#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 = color[*ip];
color[*ip] = -1 ;
}
return c ;
}
/*檢查地區i,對c種顏色的可用性*/
int colorok( int i , int c , int adj[][N] , int color[ ] )
{
int j ;
for ( j = 0 ; j < i ; j++ )
if (adj[i][j] != 0 && color[j] == c)
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(i,k,adj,color) )
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 =select (i,c+1,adj,color) ) == 0 ){
c = back( &i , color) ;
if ( c == 0) return cnt ;
}
else
{
color[i]=c; 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 ) ) ;coloring( adj ) ;
}
這是一個遞迴與迴圈的嵌套。
用迴圈對每一個地圖格的周圍三個格子進行搜尋。
(周圍共四個格子,其中一個是初始格)
對於每一次搜尋,再用遞迴進行下一層的搜尋。
這樣迴圈並遞迴下去,就能對整幅地圖充分搜尋了。