题目链接:hdu 4414
其实是一道简单的字符型水题,不涉及任何算法,可比赛时却没能做出来,这几天的状态都差到家了。。。
题目大意是求有多少个满足条件的十字架,十字架的边不能有分叉路口,所以枚举每个点看是否满足条件就行,只是编码量的问题而已(感觉自己的码力不断下降了,我也不知道该怎么办好。。)
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 6 char s[52][52]; 7 int n; 8 9 int check(int x, int y) { 10 if(s[x][y] != '#') return 0; 11 int up = 0, down = 0, left = 0, right = 0; 12 for(int i = x - 1; i >= 0; --i) { 13 if(s[i][y] == '#') ++up; 14 else break; 15 if(s[i][y - 1] == '#' || s[i][y + 1] == '#') return 1; 16 } 17 if(up == 0) return 2; 18 19 for(int i = x + 1; i <= n - 1; ++i) { 20 if(s[i][y] == '#') ++down; 21 else break; 22 if(s[i][y - 1] == '#' || s[i][y + 1] == '#') return 3; 23 } 24 if(down == 0) return 4; 25 26 if(up != down) return 5; 27 28 for(int j = y - 1; j >= 0; --j) { 29 if(s[x][j] == '#') ++left; 30 else break; 31 if(s[x - 1][j] == '#' || s[x + 1][j] == '#') return 6; 32 } 33 if(left == 0) return 7; 34 35 for(int j = y + 1; j <= n - 1; ++j) { 36 if(s[x][j] == '#') ++right; 37 else break; 38 if(s[x - 1][j] == '#' || s[x + 1][j] == '#') return 8; 39 } 40 if(right == 0) return 9; 41 42 if(left != right) return 10; 43 44 if(up != left) return 11; 45 46 return 12; 47 } 48 49 int main() { 50 while(~scanf("%d",&n),n) { 51 for(int i = 0; i < n; ++i) 52 scanf("%s",s[i]); 53 int cnt = 0; 54 for(int i = 1; i < n - 1; ++i) 55 for(int j = 1; j < n - 1; ++j) 56 if(check(i,j) == 12) ++cnt; 57 printf("%d ",cnt); 58 } 59 return 0; 60 }
学到了这种调试方法,每一步的 return 值都不同,这样子调试程序时就能很清楚问题是出在哪儿,在哪儿的运行和自己想的不一样。原本我把 check 函数定义为 bool 返回类型,每个不合法的都返回 0,最后那个 return 才返回 1,这样子原则上可以,但一旦出错却不知错在哪一步,所以以后记得在编码上需灵活一些,别再纠结于那些所谓的节省内存等问题了!!!