| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:判断连通分量是否一致。。。参照一个大神的。思路。但是不解为了啥。有人能探讨一下为啥么?In Reply To:判断连通分量是否一致。。。参照一个大神的。思路。但是不解为了啥。有人能探讨一下为啥么? Posted by:274856653 at 2019-09-26 22:07:41 #include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
#define MAX_N 100 + 10
#define MAX_STAR 160 + 10
char source[MAX_N][MAX_N];
int visit[MAX_N][MAX_N];
int w, h;
int dx[8] = {0, 0, 1, -1, 1,-1, 1, -1 };
int dy[8] = {1, -1, 0, 0, 1, 1, -1, -1 };
typedef struct
{
int num;
long long det;
int flag;
int iSameNum;
}ST_cluster;
ST_cluster stCluster[30];
typedef struct
{
int y;
int x;
}ST_member;
ST_member stMember[MAX_STAR];
int iNum;
int iFlag;
void initVar()
{
memset(source, 0, sizeof(source));
memset((char *)&stCluster, 0, sizeof(stCluster));
iFlag = 0;
}
void printfMatix()
{
int i;
for(i = 0; i<h; i++)
{
printf("%s\n", source[i]);
}
}
void add(int y, int x)
{
stMember[iNum].y = y;
stMember[iNum].x = x;
visit[y][x] = 1;
iNum++;
}
void dfs(int y, int x)
{
int i, yy, xx;
for(i = 0; i<8; i++)
{
yy = y + dy[i];
xx = x + dx[i];
if(xx>=0 && xx<w && yy>=0 && yy<h && 0 == visit[yy][xx] && '1' == source[yy][xx])
{
// printf("xx = %d, yy = %d, visit[yy][xx] = %d, source[yy][xx] = %d\n", xx, yy, visit[yy][xx], source[yy][xx]);
add(yy, xx);
dfs(yy, xx);
}
}
}
void deal(int y, int x)
{
int i, sumx = 0, sumy = 0;
double ave_x = 0.0, ave_y = 0.0, det = 0.0, detTest = 0.0;
long long detTemp;
int iFlagFinal, iFound;
double dTemp;
iNum=0;
add(y, x);
dfs(y, x);
for(i = 0; i<iNum; i++)
{
sumx += stMember[i].x;
sumy += stMember[i].y;
}
ave_x = (double)sumx/iNum;
ave_y = (double)sumy/iNum;
// printf("sumx = %d, sumy = %d, ave_x = %f, ave_y = %f, iNum = %d\n", sumx, sumy, ave_x, ave_y, iNum);
det = 0.0;
for(i = 0; i<iNum; i++)
{
//det += (stMember[i].x - ave_x)* (stMember[i].x - ave_x)* (stMember[i].x - ave_x) + (stMember[i].y - ave_y)*(stMember[i].y - ave_y) *(stMember[i].y - ave_y);
det += (stMember[i].x - ave_x)* (stMember[i].x - ave_x)* (stMember[i].x - ave_x)* (stMember[i].x - ave_x) + (stMember[i].y - ave_y) *(stMember[i].y - ave_y)*(stMember[i].y - ave_y) *(stMember[i].y - ave_y);
}
detTemp =(long long) (det *1000000);
// if(400 == detTemp && iNum == 5)
// {
// for(i = 0; i<iNum; i++)
// {
// dTemp = ((double)stMember[i].x - ave_x)* ((double)stMember[i].x - ave_x) + ((double)stMember[i].y - ave_y) *((double)stMember[i].y - ave_y);
// detTest += dTemp;
// printf("stMember[i].x = %d, ave_x = %f, stMember[i].y = %d, ave_y = %f, dTemp = %f, detTest = %f\n", stMember[i].x, ave_x, stMember[i].y, ave_y, dTemp, detTest);
// }
//
// }
//iFlag 有多少个相似的星系
iFlagFinal = 0;
iFound = 0;
for(i = 0; i<iFlag; i++)
{
if(iNum == stCluster[i].num && detTemp == stCluster[i].det )
{
iFlagFinal = stCluster[i].flag;
stCluster[i].iSameNum++;
iFound = 1;
break;
}
}
if(0 == iFound)
{
stCluster[iFlag].num = iNum;
stCluster[iFlag].det = detTemp;
stCluster[iFlag].flag = iFlag;
stCluster[iFlag].iSameNum = 1;
iFlagFinal = iFlag;
iFlag++;
}
//printf("ave_x = %f,ave_y = %f det = %f, detTemp = %lld,iNum = %d, iFlagFinal = %d, stCluster[iFlagFinal].iSameNum = %d \n", ave_x, ave_y, det, detTemp, iNum, iFlagFinal, stCluster[iFlagFinal].iSameNum);
// printf("iFlagFinal = %d, iFlag = %d\n", iFlagFinal, iFlag);
for(i = 0; i<iNum; i++)
{
source[stMember[i].y][stMember[i].x] = 'a' + iFlagFinal;
}
//printfMatix();
}
int main()
{
int i, j;
while(scanf("%d\n%d", &w, &h)!=EOF)
{
initVar();
// printf("w = %d, h = %d\n", w, h);
// printf("u = %d\n", 'u'-'a');
for(i = 0; i<h; i++)
scanf("%s", source[i]);
//printfMatix();
for(i = 0; i<h; i++)
{
for(j = 0; j<w; j++)
{
if( 0 == visit[i][j] && '1' == source[i][j] )
{
deal(i, j);
}
}
}
// printf("after handle\n");
printfMatix();
}
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator