zoj 2412 Farm Irrigation(DFS~)

这个啊。其实感觉不是太像DFS,不用回溯啊,真好。

 

感觉有点像求并查集的~

 

我用数组把那11块田表示出来了,强大吧。。。用3*3的,有管子的赋为1。。。

 

构建图比较麻烦,不过构建出来就很好做了,就是属于很水的DFS了。

 

觉得有点像求最小生成树哈,求出有多少棵树,以前做过类似的题捏。

 

A了后,查了查网上的,都看着很繁。。。还是我这个好~!就是比较耗内存哈~

 

#include <stdio.h> #include <stdlib.h> #include <iostream> #include <string.h> using namespace std; int n,m; int square[11][9] = {{0,1,0,1,1,0,0,0,0},{0,1,0,0,1,1,0,0,0},{0,0,0,1,1,0,0,1,0},//11个区域表示 {0,0,0,0,1,1,0,1,0},{0,1,0,0,1,0,0,1,0},{0,0,0,1,1,1,0,0,0}, {0,1,0,1,1,1,0,0,0},{0,1,0,1,1,0,0,1,0},{0,0,0,1,1,1,0,1,0}, {0,1,0,0,1,1,0,1,0},{0,1,0,1,1,1,0,1,0}}; int map[500][500]; int flag[500][500]; int dir[4][2] = {0,1,0,-1,-1,0,1,0},sum; void DFS(int x,int y) { flag[x][y] = 1; for(int i=0; i<4; i++) { int a = x+dir[i][0]; int b = y+dir[i][1]; if( a>0 && a<=m*3 && b>0 && b<=n*3 && !flag[a][b] && map[a][b] ) DFS(a,b); } } int main(void) { char ch; int x; while( cin >> m >> n && n!=-1 ) { memset(flag,0,sizeof(flag)); memset(map,0,sizeof(map)); getchar(); sum = 0; for(int i=1; i<=m; i++) { for(int k=1; k<=n; k++) { scanf("%c",&ch); x = ch - 'A'; for(int j=0; j<9; j++) map[(i-1)*3+j/3+1][(k-1)*3+j%3+1] = square[x][j]; // 这个得好好算算 } getchar(); } for(int i=1; i<=m*3; i++) { for(int k=1; k<=n*3; k++) if( map[i][k] && !flag[i][k] ) { sum++; DFS(i,k); } } cout << sum << endl; } return 0; }  

你可能感兴趣的:(c)