提升coding能力------搜索专题(1)-----poj1175

pku 1175 Starry Night

题目地址:http://acm.pku.edu.cn/JudgeOnline/problem?id=1175

 

题目大意:

就是给你一个图,你必须按照从左到右,从上到下的顺序对每块联通块进行编号,并且按照编号的字典序,把每个连通块变成

'a' + number (number从0开始的图案)

详细分析:

由于做的时间离现在有点久,博主以后会对这个系列的题进行详细分析。

AC代码:

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cmath>
using namespace std;
#define N 105
#define eps 1e-9
struct Node
{
    int x;
    int y;
}s[N*N];
int w,h,cnt = 0,num =0;
char Map[N][N];
int dirc[8][2] = {{1,-1},{1,0},{1,1},{0,1},{0,-1},{-1,0},{-1,1},{-1,-1}};
int vis[N][N];
double ans[N*5] ;
int sgn(double  x)
{
    return x < -eps? -1: x < eps? 0: 1;

}
void cal()
{
    double sum = 0;
    for(int i = 0 ;i < cnt; i++ )
        for(int j = i + 1; j < cnt ;j++ )
        {
           sum += sqrt((s[i].x - s[j].x)*(s[i].x - s[j].x)*1.0 + (s[i].y - s[j].y)*(s[i].y - s[j].y)*1.0);

        }

        if(cnt == 1)
             sum = 0.0;

        //cout << "sum is :" << sum << endl;

        int temp = -1 ;

        for(int i= 0; i < num ;i++)
        {
            if(sgn(ans[i] - sum) == 0)
            {

                  temp = i;
                  break;
            }
        }

        if(temp == -1)
        {
            temp = num;
            ans[num++] = sum;
        }



        for(int i = 0; i < cnt ;i++ )
        {
            Map[s[i].x][s[i].y] = 'a' + temp;
        }


}
int Find_union(int pos_x,  int pos_y)
{

    vis[ pos_x ][ pos_y ] = 1;
    int sum = 0;
    Node temp;
    temp.x = pos_x;
    temp.y = pos_y;
    s[ cnt++ ] = temp;

    for(int i = 0 ;i < 8; i++)
    {
        int temp_x = pos_x + dirc[i][0];
        int temp_y = pos_y + dirc[i][1];

        if(temp_x >=0 && temp_x < h && temp_y >=0 && temp_y < w && Map[temp_x][temp_y] == '1' && !vis[temp_x][temp_y])
        {
            sum ++;

            sum += Find_union(temp_x, temp_y);


        }
    }

    return sum;

}

int main()
{
    while(cin >> w >> h)
    {
        for(int  i = 0 ;i < h ; i++ )
            for(int  j = 0 ;j < w ; j++ )
                 cin >> Map[i][j];

        memset(vis, 0, sizeof(vis));


       int order = 0;
       for(int i = 0; i < h ;i++ )
          for(int j = 0 ; j < w ;j++ )
                if(!vis[i][j] && Map[i][j] =='1')
                {
                    cnt = 0;
                    Find_union( i, j );
                    order++ ;
                    cal();

    


                }


         //cout << "------------------------------" << endl;

          for(int i = 0 ;i < h ; i++ )
          {

            for(int j = 0 ;j < w ; j++ )
                 cout << Map[i][j];
            cout << endl;
          }




    }


    return 0;
}

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值