独立岛问题的BFS,DFS求解

#include #include using namespace std; #define _CRT_SECURE_NO_WARNINGS #define MAX 20 #define queue_init (head=tail=0) #define queue_is_empty (head==tail) #define en_queue(x) (queue[tail++]=x) #define de_queue (queue[head++]) struct point{ int x; int y; }; struct point queue[MAX*MAX]; int head, tail; int a[] = { 1, -1, 0, 0 }; int b[] = { 0, 0, 1, -1 }; int N, M; int map[MAX][MAX], vis[MAX][MAX]; int Ans; int color; int sum; int maxmin; void bfs(int flag,int i, int j){ queue_init; point start; start.x = i; start.y = j; en_queue(start); map[start.x][start.y] = flag; vis[start.x][start.y] = 1; sum=1; while (!queue_is_empty){ point p = de_queue; for (int k = 0; k < 4; k++){ point next; next.x = p.x + a[k]; next.y = p.y + b[k]; if (next.x<1 || next.x>N || next.y<1 || next.y>M) continue; if (vis[next.x][next.y] == 1) continue; if (map[next.x][next.y]>0){ map[next.x][next.y] = flag; sum++; vis[next.x][next.y] == 1; en_queue(next); } } } maxmin = sum > maxmin ? sum : maxmin; } int main(){ freopen("input.txt","r",stdin); int T; cin >> T; for (int t = 1; t <= T; t++){ color = 0; cin >> N >> M; for (int i = 1; i <= N; i++){ for (int j = 1; j <= M; j++){ cin >> map[i][j]; } } for (int i = 1; i <= N; i++){ for (int j = 1; j <= M; j++){ if (map[i][j] > 0){ bfs(--color,i,j); } } } cout << "#" << t << " " << -color <<" "<< maxmin< using namespace std; #define _CRT_SECURE_NO_WARNINGS int T, N, M, sum,max,a[20][20], book[20][20]; int Next[4][2] = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } }; void dfs(int x, int y, int color){ int tx, ty, k; //染色当前坐标 a[x][y] = color; //循环 for (k = 0; k <= 3; k++){ //新坐标 tx = x + Next[k][0]; ty = y + Next[k][1]; //判断边界 if (tx<1 || tx>N || ty < 1 || ty>M) continue; //判断是否可走 if (a[tx][ty] >= 1 && book[tx][ty] == 0){ sum++; //标记走过 book[tx][ty] = 1; //开始尝试下一个点 dfs(tx,ty,color); if (sum > max) max = sum; } } return; } int main(){ int i, j, t, num = 0; freopen("input.txt","r",stdin); setbuf(stdout, NULL); //输入数据 cin >> T; for (t = 1; t <= T; t++){ cin >> N >> M; for (i = 1; i <= N; i++) for (j = 1; j <= M; j++) cin >> a[i][j]; //判断传入dfs函数的参数,调用dfs() for (i = 1; i <= N; i++){ for (j = 1; j <= M; j++){ if (a[i][j] >= 1){ num--; book[i][j] = 1; dfs(i, j, num); } } } //输出 cout << -num << " " << max << endl; for (i = 1; i <= N; i++){ for (j = 1; j <= M; j++) printf("%3d", a[i][j]); cout << endl; } } while (1); return 0; }
posted @ 2017-01-17 16:31  wujixing909  阅读(150)  评论(0编辑  收藏  举报