poj1562

1 篇文章 0 订阅
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
#include<math.h>

int m,n;


char map[110][110];
int num;
int dir[8][2] ={{1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};
//这是一种坐标移动办法
/*
还有另外一种,这样也是可以的,但我觉得用数组把坐标移动方式记录下来,这样方便一点 
   
        DFS(p - 1, q - 1);  
        DFS(p - 1, q);  
        DFS(p - 1, q + 1);  
        DFS(p, q - 1);  
        DFS(p, q + 1);  
        DFS(p + 1, q - 1);  
        DFS(p + 1, q);  
        DFS(p + 1, q + 1);  
        
        第三种是吧x和y的移动的坐标 分开写,比如这样
		int movex[8]={1,1,1,-1,-1,-1,0,0},movey[8]={1,0,-1,1,0,-1,1,-1};   
}   
*/ 



void Dfs(int t,int u)
{
	int i,a,b;
	map[t][u] = '*';
	for( i = 0 ; i < 8 ; i ++)
	{
		a = t + dir[i][0]; //x 坐标的移动 
		b = u + dir[i][1]; //y 坐标的移动 
		if(( a >= 0)&& (a < m) && (b >= 0) && (b < n)&&map[a][b] == '@')
		{
			Dfs(a,b);
		}
	}
	

}

int main()
{
	int i , j ;
	while(scanf("%d%d",&m,&n) && m )
	{
		num = 0;
		memset(map,0,sizeof(map));
		for(i = 0 ; i < m ; i ++)
		{
			scanf("%s",map[i]);
		}
		for( i = 0 ; i < m ; i ++)
		{
			for(j = 0; j < n ; j ++)
			{
				if(map[i][j] == '@')
				{
					num++;
					Dfs(i,j);
				}
			}
		}
		printf("%d\n",num);
	} 
	return 0;
} 

第二种完整的代码:


#include <stdio.h>
#include <string.h>

#define MAXN 100 + 10

char graph[MAXN][MAXN];

int count;
int m, n;

void DFS(int p, int q);

int main()
{



    int i, j;
    while(scanf("%d%d", &m, &n) && m != 0)
    {

        // 初始化
        count = 0;
        memset(graph, 0, sizeof(graph));
        
        // 数据输入
        for(i = 0; i < m; i++)
        {
            for(j = 0; j < n; j++)
            {
                scanf("\n%c", &graph[i][j]);
            }
        }
        
        // 算法主体
        for(i = 0; i < m; i++)
            for(j = 0; j < n; j++)
                if(graph[i][j] == '@')
                {
                    DFS(i, j);
                    count++;
                }
        
        // 数据输出
        printf("%d\n", count);
    }

    return 0;
}

void DFS(int p, int q)
{

    if(p >= 0 && p <= m - 1 && q >= 0 && q <= n - 1 && graph[p][q] == '@')
    {
        graph[p][q] = '*';//把遍历过的 @ 变成 * 防止遍历其他的点的时候,误判 
    }
    else
    {
        return;
    }
        //第二种的便利八个方向上的点,就是直接移动,没有调数组 
        DFS(p - 1, q - 1);
        DFS(p - 1, q);
        DFS(p - 1, q + 1);
        DFS(p, q - 1);
        DFS(p, q + 1);
        DFS(p + 1, q - 1);
        DFS(p + 1, q);
        DFS(p + 1, q + 1);
}



第三种呢就是把x的移动存为一个数组,把Y的移动存为一个数组

下面是代码


//这个是第三种啦
#include<cstdio>
#include<cstring>
#include<iostream>
#define MAX 101
using namespace std;
int n,m,ans;
char map[MAX][MAX];
bool vis[MAX][MAX];
int movex[8]={1,1,1,-1,-1,-1,0,0},movey[8]={1,0,-1,1,0,-1,1,-1};
bool isborder(int x,int y)
{
    if(x<0||x>=n||y<0||y>=m)
	return true;
    return false;
}
void DFS(int x,int y)
{
    if(isborder(x,y)||map[x][y]=='*')
	return;
    for(int i=0;i<8;i++)
    {
	int itx=x+movex[i];
	int ity=y+movey[i];
	if(isborder(itx,ity)||vis[itx][ity])
	    continue;
	vis[itx][ity]=1;
	if(map[itx][ity]=='@')
	    DFS(itx,ity);
    }
}

int main()
{
    while(scanf("%d%d",&n,&m)&&(n||m))
    {
	for(int i=0;i<n;i++)
	    scanf("%s",&map[i]);
	memset(vis,0,sizeof(vis));
	ans=0;
	for(int i=0;i<n;i++)
	    for(int j=0;j<m;j++)
		if(!vis[i][j]&&map[i][j]!='*')
		{
		    DFS(i,j);
		    ans++;
		}
	printf("%d\n",ans);
    }
    return 0;
}


其实我觉得这三种都是差不多的,反正你自己开心就好,另外还有人用的是bfs做出来的,bfs现在暂时还没研究~







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值