Untitled
unknown
plain_text
2 years ago
2.6 kB
2
Indexable
#include <stdio.h> /*--------------------Init Variable------------------------*/ int input[102][102]; int Answer; int N; int list_zeros[102*102][2]; int count_zero; int list_count[6]; int visit[102][102]; int dx[] = {-1,1,0,0}; int dy[] = {0,0,1,-1}; int temp_max; int max[102*102]; int count_area_zero; /*---------------------Init BFS-----------------------------*/ int start, end; int Queue[999999][2]; bool isEmpty(){ return start == end; } void Push(int x, int y){ Queue[end][0] = x; Queue[end][1] = y; end++; } int Pop(){ int temp = start; start++; return temp; } void BFS(int x, int y){ Push(x,y); visit[x][y] = 1; int curr, xCurr, yCurr, u, v; while(!isEmpty()){ curr = Pop(); xCurr = Queue[curr][0]; yCurr = Queue[curr][1]; for(int i = 0; i < 4; i++){ u = xCurr + dx[i]; v = yCurr + dy[i]; if(u < 0 || v < 0 || u >= N || v >= N || visit[u][v] == 1) continue; if(input[xCurr][yCurr] == 0 || input[u][v] == input[xCurr][yCurr]){ visit[u][v] = 1; if(input[u][v] != 0) list_count[input[u][v]]++; if(list_count[temp_max] < list_count[input[u][v]]) temp_max = input[u][v]; if(list_count[temp_max] == list_count[input[u][v]]) if(temp_max < input[u][v]) temp_max = input[u][v]; Push(u, v); } } } } int main(void) { int test_case; int T; freopen("input.txt", "r", stdin); setbuf(stdout, NULL); scanf("%d", &T); for (test_case = 1; test_case <= T; ++test_case) { Answer = 0; count_zero = 0; scanf("%d", &N); for(int i = 0; i<N;i++) for(int j = 0; j < N ; j++){ scanf("%d",&input[i][j]); if(input[i][j] == 0){ list_zeros[count_zero][0] = i; list_zeros[count_zero++][1] = j; } visit[i][j] = 0; } count_area_zero=0; for(int i = 0; i < count_zero; i++){ temp_max = 0; if(input[list_zeros[i][0]][list_zeros[i][1]] == 0){ start = end = 0; BFS(list_zeros[i][0], list_zeros[i][1]); max[count_area_zero++] = temp_max; } else continue; for(int q = 0; q<N;q++) for(int k = 0; k < N ; k++) visit[q][k] = 0; for(int h = 1; h <= 5; h++) list_count[h] = 0; } for(int i = 0; i < count_zero; i++) { input[list_zeros[i][0]][list_zeros[i][1]] = max[i]; max[i] = 0; } for(int i = 0; i<N;i++) for(int j = 0; j < N ; j++){ if(visit[i][j] == 0){ start = end = 0; BFS(i, j); Answer++; } } for(int q = 0; q<N;q++) for(int k = 0; k < N ; k++) visit[q][k] = 0; for(int h = 1; h <= 5; h++) list_count[h] = 0; printf("Case #%d\n%d\n",test_case, Answer); } return 0; }
Editor is loading...