现在的位置: 首页 > 综合 > 正文

noj 1060-图像审查

2018年03月17日 ⁄ 综合 ⁄ 共 1314字 ⁄ 字号 评论关闭
 在背景为0的画面使用4联。当填充时遇到‘1’表示遇到一个图形元素 计数+1
此时对´1´进行8联填充,目的是把一个完整图形元素做访问标记,这样再遇到该图形元素就不会重复计数
再返回,继续对背景4联填充。
原先用floodfill给封闭的图的边涂色,再深搜 看有多少个不同的连通图 结果wrong了
 后来发现,原来是递归里,栈和队列调用太深,栈溢出了,得自己来栈!!
#include "stdio.h"
#define M 1005
char map[M][M];
int dx0[] = {-1,0,1,0};
int dy0[] = {0,-1,0,1};
int dx[] = {-1,-1,0,1,1,1,0,-1};
int dy[] = {0,-1,-1,-1,0,1,1,1};
struct node
{
    int
x,y;
}visit[1000000],find[1000000];
void floodfill (int x,int y,int n,int m);
void DFS (int x,int y,int n,int m);
int main ()
{
    int
n,m,n0,m0,i,j,count = 0;
    scanf ("%d
%d",&n0,&m0);
    n =
n0+2;
    m =
m0+2;
    getchar
();
    for (i = 1;i
<= n0;i ++)
    gets
(map[i]+1);

    for (i = 0;i
<= n0+1;i ++)
    for (j = 0;j
<= m0+1;j ++)
    if
(i==0||i==n0+1||j==0||j==m0+1)  
//给图加边框,从0,0开始搜,如果不加框,当
                                       
//0,0是1的话,就会忽视其它的元素
    map[i][j] =
'0';
   
floodfill(0,0,n,m);
    for (i = 0;i
< n;i ++)
    for (j = 0;j
< m;j ++)
    {
       
if (map[i][j] == '2')
       
{
           
count
++;              
//有多少个不同的颜色的子图
           
DFS (i,j,n,m);
       
}
    }
    printf
("There are %d shape elements\n",count);
    return
0;
}
void floodfill (int x,int y,int n,int
m)   //BFS 给图着色
{
    int
top,rear,i,x0,y0;
    rear =
-1;
    top =
0;
   
find[++rear].x = x;
    find[rear].y
= y;
    while (top
<= rear)
    {
       
x0 = find[top].x;
       
y0 = find[top++].y;
       
if (map[x0][y0] == '0')
       
map[x0][y0] = '#';
       
for (i = 0;i < 4;i ++)
       
{
           
x = x0+dx0[i];
           
y = y0+dy0[i];
     

抱歉!评论已关闭.