uva 657 The die is cast

题意:给定一个图  分别找出每片*中 X的数量  统计并排序

解题思路:分别标记'X' 和'*' 深搜 ,深搜‘*’和'X'在找到‘X’的时候再深搜‘X’

解题代码:

// File Name: uva572.c
// Author: darkdream
// Created Time: 2013年05月22日 星期三 19时19分08秒

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
char str[128][128];
int visit[128][128];
int mivisit[120][120];
struct node 
{
    int i , j ;

}nodes[10000],minodes[1000];
int cmp(const void *a,const void *b)
{
    return *(int *)a - *(int*)b;
}
int xadd[] = {+1,-1,0,0};
int yadd[] = {0,0,+1,-1};
int main(){

    //freopen("/home/plac/problem/input.txt","r",stdin);
    //freopen("/home/plac/problem/output.txt","w",stdout);
    int n ,m,t =  0; 
    while(scanf("%d %d",&n,&m) != EOF)
    {
        t ++;
        memset(str,0,sizeof(str));
        memset(nodes,0,sizeof(nodes));
        memset(visit,0,sizeof(visit));
        memset(mivisit,0,sizeof(mivisit));
        if(n == 0 && m == 0)
            break;
        for(int i = 1;i <= m; i ++)
        {
            scanf("%s",&str[i][1]);
        }
        int sum = 0 ;
        int k[1000];
        for(int i = 1 ; i <= m ;i ++)
        {
            for(int j = 1 ;j <= n ; j++)
            {
                if((str[i][j] == '*' || str[i][j] == 'X' )&& visit[i][j] == 0)
                {
                    memset(nodes,0,sizeof(nodes));
                    sum++;
                    nodes[1].i = i ; 
                    nodes[1].j = j ;
                    visit[i][j] =1 ;
                    int low  = 1, high = 1,temp =  0;;
                    while(low <= high )
                    {
                        for(int k = 0 ;k < 4 ;k ++)
                        {  
                            int tx = nodes[low].i + xadd[k];
                            int ty = nodes[low].j + yadd[k];
                            if((str[tx][ty] == '*' ||str[tx][ty] == 'X') && !visit[tx][ty] )
                            {
                                if(str[tx][ty] == 'X' && !mivisit[tx][ty] )
                                {
                                    temp ++;
                                    memset(minodes,0,sizeof(minodes));
                                    minodes[1].i = tx;
                                    minodes[1].j = ty;
                                    mivisit[tx][ty] = 1 ;
                                    int milow = 1, mihigh = 1; 
                                    while(milow <= mihigh )
                                    {
                                        for(int s = 0 ;s < 4 ;s ++)
                                        {  
                                            int mitx = minodes[milow].i + xadd[s];
                                            int mity = minodes[milow].j + yadd[s];
                                            if( str[mitx][mity] == 'X' && !mivisit[mitx][mity] )
                                            {
                                                mihigh++;
                                                mivisit[mitx][mity] = 1; 
                                                minodes[mihigh].i = mitx;
                                                minodes[mihigh].j = mity;
                                            }
                                        }
                                        milow++;
                                    }

                                }
                                high++;
                                visit[tx][ty] = 1; 
                                nodes[high].i = tx;
                                nodes[high].j = ty;
                            }
                        }
                        low++;
                    }
                    k[sum] = temp;
                }
            }
        }
        printf("Throw %d\n",t);
        qsort(k+1,sum,sizeof(int),cmp);
        for(int i = 1;i <= sum ;i ++)
        {
            if(i != 1)
               printf(" ");
            printf("%d",k[i]);
        }
        printf("\n\n");

    }
    return 0 ;
}
View Code

 

转载于:https://www.cnblogs.com/zyue/archive/2013/05/22/3093636.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值