hdu 1312 Red and Black 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1312
第二条深搜,题目并不难,但是做了我好久好久,由于一个细节,让我赌上了一个晚上的时间。
题目大意:从图中的标记'@'开始,向四个相邻的方向找黑色瓷片'.' ,统计能经过的黑色瓷片的数目('@'也算统计中的一个),当然,这个人是不能走红色瓷片'#'的。
有两个地方需要注意:1、要分清w、h,哪一个对应行,哪一个表示列,非常别扭,最好不要按它的(w:列 h:行) 2、统计符合条件的 '.' 时,不要遗漏了对初始位置'@'的统计。
总结: 细心真的非常非常重要!!!!
1 #include <iostream> 2 using namespace std; 3 4 char map[25][25]; 5 int h, w, num; 6 7 void dfs(int i, int j) 8 { 9 if (map[i][j] != '.' || i < 0 || j < 0 || i >= h || j >= w) 10 return; 11 else 12 { 13 num++; //找到'.'就统计 14 map[i][j] = '#'; 15 dfs(i-1, j); 16 dfs(i, j+1); 17 dfs(i+1, j); 18 dfs(i, j-1); 19 } 20 } 21 22 int main() 23 { 24 int i, j, k, l; 25 while (cin >> w >> h && (w || h)) 26 { 27 num = 0; 28 for (i = 0; i < h; i++) //h的位置之前写成了w, 29 { 30 for (j = 0; j < w; j++) //w的位置之前写成了h,下面的for语句也是这样,找了很久才发现这个bug 31 32 cin >> map[i][j]; 33 } 34 for (i = 0; i < h; i++) 35 { 36 for (j = 0; j < w; j++) 37 { 38 if (map[i][j] == '@') 39 { 40 map[i][j] = '.'; 41 dfs(i, j); 42 } 43 } 44 } 45 cout << num << endl; 46 } 47 return 0; 48 }