關於地圖深搜的問題

北郵OJ[278]


最近遇到兩題關於地圖深搜的題,一道是杭電[1010]狗狗找門,自己寫不出來,看了別人的答案。今天遇到這題,試着用深搜思路寫了出來,記錄下來。


《圖像識別》,一個點的相鄰的8個點中,只要數值與該點相差不超過給定值,就認爲是一個色域,求色域的個數。


1,涉及地圖,且有走動的題,多會定義方向,注意二維數組的定義方式:

int direction[8][2] = {{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};

2,注意地圖座標的邊界條件


3,二維數組的傳參問題,二維數組要至少規定列纔可以穿參


代碼(被學長說代碼風格進步很大,嗨森! 簡直是一個程序員女友養成記,冷笑):

#include <cstdio>
#include <iostream>
#include <cmath>

using namespace std;


int direction[8][2] = {{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};

int DFS(int val, int x, int y, int map[][100], int d, int row, int col){
	map[x][y] = -1;
	for(int i = 0; i < 8; i++){
		int newx = x + direction[i][0];
		int newy = y + direction[i][1];
		if(newx > -1 && newx < row && newy > -1 && newy < col
			&& map[newx][newy] > -1 
			&& abs(map[newx][newy] - val) <= d){
			//cout << "val:" << val << ": " << map[newx][newy] << "x: " <<newx << "y: " <<newy<< endl;
			DFS(map[newx][newy], 
				newx, newy, map, d, row, col);
		}
	 }
	return 0;
}

int main(){
	int n;
	cin >> n;
	while(n--){
		int row, col, d;
		cin >> row >> col >> d;
		int map[100][100] = {-1};
		for(int i = 0; i < row; i ++){
			for(int j = 0; j < col; j++){
				scanf(" %d", &map[i][j]);
			}
		}
		int num = 0;
		for(int i = 0; i < row; i ++){
			for(int j = 0; j < col; j++){
				if(map[i][j] != -1){
					DFS(map[i][j], i, j, map, d, row, col);
					num ++;
					//cout << "num: "<< num << endl;
				}
				
			}
		}
		cout << num << endl;
	}
}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章