C语言利用迷宫寻路算法对图像进行染色

题目

在这里插入图片描述

利用迷宫寻路算法对图像进行染色
	/* 此算法类似于迷宫寻路算法 */
	#include <stdio.h>		
	#include <stdlib.h>	  //提供system函数
	#include <time.h>	  //提供time函数原型 
	
	/* 宏定义 */
	#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}};//储存颜色0和颜色1 
			
		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;	 //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)    //颜色0显示为空白 
					printf(" ");
			 	if(g[i][j]==Color_2)	//颜色1用"^"显示
					printf("^");
				if(g[i][j]==Color_3)	//颜色2用"*"显示 
					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)	//将颜色为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;	//将此像素点颜色染为颜色2		
	}
	
	/* 获取下一个该染色的点的信息 */
	int NextPos(SElemType *e){	
		SElemType tmp;
		tmp = *e;
		
		switch(tmp.di){
			case East: (tmp.y)++;	   //East代表向右 
				break;
			case South: (tmp.x)++;	   //South代表向下 
				break;
			case West: (tmp.y)--;	   //West代表向左 
				break;
			case North: (tmp.x)--;	   //North代表向上 
				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;
	}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值