题目链接:http://codeforces.com/problemset/problem/389/B
题目意思:给出一个由n行n列组成的board,其中'#'表示的一片地方恰好能画满十字架,画满的意思表示:这些十字架不能够共用'#' !当然如果全部都是'.',表示不画十字架。问如果有'#'和'.'的board上,是否恰好能填满所有'#'。能就输出 'YES',否则输入'NO'
比赛的时候完全没有思路,这是赛后做出来的,参考了别人的思路。
可以这样想,考虑到十字架这么特殊的图案,以每个十字架的最高点为判断的起始点,也就是说,当能画一个十字架时,绝对是首先遇上它的最高点的!然后判断该点的正下方连续两点,还有下方第一个点紧挨着左右两边是否也为'#'即可。另外一个要考虑的地方是肯定不能画十字架的情况,每一列的第一个和最后一个字符如果为'#'是不能画十字架的,还有,倒数后两行出现'#'也是不行的。
这次比赛的题目总的来说,很有意思,虽然食蛋了!大悲剧~~~
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cstring> 5 using namespace std; 6 7 const int maxn = 100 + 10; 8 char cell[maxn][maxn]; 9 10 int main() 11 { 12 int i, j, n, flag; 13 while (scanf("%d", &n) != EOF) 14 { 15 for (i = 0; i < n; i++) 16 scanf("%s", cell[i]); 17 flag = 0; 18 for (i = 0; i < n && !flag; i++) 19 { 20 for (j = 0; j < n && !flag; j++) 21 { 22 if (cell[i][j] == '#') 23 { 24 if (j == 0 || j == n-1 || i >= n-2 || cell[i+1][j] != '#' || cell[i+1][j-1] != '#' || cell[i+1][j+1] != '#' || cell[i+2][j] != '#') // 第1列,最后1列,倒数后两行,还有十字架所占的所有地方都要检测 25 { 26 printf("NO "); 27 flag = 1; 28 } 29 else // 十字架所占的'#'注销掉,以避免阻碍判断下一个十字架 30 { 31 cell[i+1][j] = '.'; 32 cell[i+1][j-1] = '.'; 33 cell[i+1][j+1] = '.'; 34 cell[i+2][j] = '.'; 35 } 36 } 37 } 38 } 39 if (!flag) 40 printf("YES "); 41 } 42 return 0; 43 }