ZOJ-2412
2014-03-29 22:51
309 查看
连通块搜索,DFS之,细节要注意,路径除了管道的方向外,还要考虑管道方向延伸出去的连接方块是否和原管道相接,我开始的时候没考虑到,答案就是错的
#include<stdio.h> static int m, n; char c[50][50]; static int dir[4][2] = { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 } }; static int map[11][4] = { { 0, 2, -1, -1 }, { 0, 3, -1, -1 }, { 1, 2, -1, -1 }, { 1, 3, -1, -1 }, { 0, 1, -1, -1 }, { 2, 3, -1, -1 }, { 0, 2, 3, -1 }, { 0, 1, 2, -1 }, { 1, 2, 3, -1 }, { 0, 1, 3, -1 }, { 0, 1, 2, 3 } }; static int pass[4] = { 1, 0, 3, 2 }; static int can_pass(int dir, char to) { int i, *array = map[to - 'A']; for (i = 0; i < 4 && array[i] != -1; i++) if (pass[dir] == array[i]) return 1; return 0; } static void dfs(int row, int col) { int i, *adjs = map[c[row][col] - 'A']; c[row][col] = 0; for (i = 0; i < 4 && adjs[i] != -1; i++) { int rr = row + dir[adjs[i]][0]; int cc = col + dir[adjs[i]][1]; if (rr >= 0 && rr < m && cc >= 0 && cc < n && c[rr][cc] && can_pass(adjs[i], c[rr][cc])) dfs(rr, cc); } } int main() { while (scanf("%d %d", &m, &n), m >= 0 && n >= 0) { getchar(); int i, j; for (i = 0; i < m; i++) { for (j = 0; j < n; j++) c[i][j] = getchar(); getchar(); } getchar(); int total = 0; for (i = 0; i < m; i++) for (j = 0; j < n; j++) if (c[i][j]) { total++; dfs(i, j); } printf("%d\n", total); } return 0; }
相关文章推荐
- (zoj 2412 Farm Irrigation)<SB并查集>
- Farm Irrigation_zoj 2412
- ZOJ 2412 Farm Irrigation(DFS)
- ZOJ 2412(Farm Irrigation)
- ZOJ 2412 Farm Irrigation
- zoj 2412 Farm Irrigation
- ZOJ 2412 Farm Irrigation
- zoj 2412 水田灌溉,求连通分支个数
- zoj 2412 Farm Irrigation ——DFS入门题
- ZOJ Problem Set - 2412
- 情况数组zoj2412-Farm Irrigation
- ZOJ 2412 Farm Irrigation
- hdu 1198/zoj 2412
- ZOJ 2412 Farm Irrigation(DFS+状态压缩)
- ZOJ 2412 Farm Irrigation
- ZOJ 2412 Farm Irrigation
- ZOJ 2412 Farm Irrigation(DFS+状态压缩)
- zoj 2412 dfs
- ZOJ 2412 dfs
- 2412 zoj