题目
利用迷宫寻路算法对图像进行染色
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SleepTime 2
#define Row 10
#define Col 17
typedef enum{ East, South, West, North }Direction;
typedef enum{ Color_1, Color_2, Color_3 }Color;
typedef struct{
int x;
int y;
int di;
}SElemType;
void Coloring(int g[][17], SElemType start);
void InitGrap(int g[][17], SElemType *start);
void PaintGrap(int g[][17]);
void ShowGrap(int g[][17]);
int Pass(SElemType e, int g[][17]);
void Mark(SElemType *e, int g[][17]);
int NextPos(SElemType *e);
int IsCross(SElemType e);
void Coloring(int g[][Col], SElemType start){
SElemType e;
SElemType stack[10000];
int top = -1;
e = start;
do{
if(Pass(e, g)){
Mark(&e, g);
ShowGrap(g);
stack[++top] = e;
NextPos(&e);
}
else{
if(top!=-1){
e = stack[top--];
while(e.di==North && top!=-1)
e = stack[top--];
if(e.di<North){
e.di++;
stack[++top] = e;
NextPos(&e);
}
}
}
}while(top!=-1);
}
void InitGrap(int g[][Col], SElemType *start){
int i, j;
int a[Row][Col]={{0,0,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0},
{0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0},
{0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0},
{0,0,0,0,1,1,1,1,1,1,1,1,1,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,1,1,1,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}};
for(i=0; i<10; i++){
for(j=0; j<17; j++)
g[i][j] = a[i][j];
}
(*start).x = 9;
(*start).y = 8;
(*start).di = East;
}
void PaintGrap(int g[][Col]){
int i, j;
for(i=0; i<Row; i++){
for(j=0; j<Col; j++){
if(g[i][j]==Color_1)
printf(" ");
if(g[i][j]==Color_2)
printf("^");
if(g[i][j]==Color_3)
printf("*");
if(j && !(j%(Col-1)))
printf("\n");
}
}
}
void ShowGrap(int g[][Col]){
system("cls");
PaintGrap(g);
}
int Pass(SElemType e,int g[][Col]){
int x = e.x;
int y = e.y;
if(g[x][y]==1)
return 1;
else
return 0;
}
void Mark(SElemType *e, int g[][Col]){
int x = (*e).x;
int y = (*e).y;
(*e).di = East;
g[x][y] = 2;
}
int NextPos(SElemType *e){
SElemType tmp;
tmp = *e;
switch(tmp.di){
case East: (tmp.y)++;
break;
case South: (tmp.x)++;
break;
case West: (tmp.y)--;
break;
case North: (tmp.x)--;
break;
default:
return 0;
}
if(IsCross(tmp)){
++(*e).di;
NextPos(e);
}
else
*e = tmp;
return 1;
}
int IsCross(SElemType e){
int x = e.x;
int y = e.y;
if(x<0 || y<0 || x>Row-1 || y>Col-1)
return 1;
else
return 0;
}
int main(int argc, char **argv){
int g[Row][Col];
SElemType start;
InitGrap(g, &start);
PaintGrap(g);
Coloring(g, start);
return 0;
}