poj1562

来源:互联网 发布:win10怎么安装软件 编辑:程序博客网 时间:2024/06/05 19:07
#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 + 10char 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 101using 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现在暂时还没研究~







0 0