NYOJ 27 水池數目
阿新 • • 發佈:2019-02-07
#include<stdio.h> int n; int map[101][101]; int row, col; int der[4][2]={{0, 1},{1, 0},{0 , -1},{-1, 0}};//用二維陣列記錄四個方向 void count(int x, int y) { int i; int x1,y1 ; map[x][y] = 0;//可以走到即置零 //else //{ for(i = 0; i < 4; i ++) { x1 = x;//可以不改變當前座標,進入下一個點 y1 = y; x1 += der[i][0];//妙!!!!! y1 += der[i][1]; if(x1 < 0 || y1 < 0 || x1 == row || y1 == col) continue; else{ if(map[x1][y1] == 1) count(x1, y1); } } //} } int main () { int i, j; int N; scanf("%d", &N); getchar(); while(N --){ scanf("%d%d",&row,&col); getchar(); for(i = 0 ; i < row; i ++) for(j = 0 ; j < col; j ++)//這能這樣初始化,不然會第一行 100 列 全部輸入完再走下一行 { scanf("%d",&map[i][j]);//初始化地圖 getchar(); } for(i = 0 ; i < row; i ++) for(j = 0 ; j < col; j ++)//判斷不為0 的點 { if(map[i][j] == 1)//一條路徑走完,那一片都被標記為 0,下次不會被找到 { n++; count(i, j); } } printf("%d\n",n); n = 0; } return 0; }
思路:以一個點為基準,這個點所能走到的所有的點 構成的一片都當成1個水池 , 即一個點所能走過的路徑就是 一片
我們只需要記錄我走了一次路 就好
為了便於查詢點,和判斷點,我們採用 遇到 水池 ,水池數目加一,而走過的路 標記為0 的方法