地址:http://codeforces.com/contest/1059/problem/B
3000多人过的题,为什么还要写博客记录一下呢?这道题是真的卡死我了,题目刚开始看了好久才看懂,然后写的时候发现得好麻烦,不想那样写,一直在想有没有写起来代码简单的写法,就这样心里抵触情绪,一直没写。。。。。。
自己的代码写的是真的丑,还有实现能力也不是很强,烦死了。。。。。。
当时如果硬着头皮写下去,调一调bug还是可以写出来的。。。。。。
我为什么要用vis数组标记啊,标记完又增加代码难度了,就是自己给自己找不痛快。。。
找了一个当时和自己思路差不多的代码,人家就处理的很好,遇到一个#就在8个方向找中心点,只要存在一个正方形边界即可,人家用flag+或运算,就处理的很好。。。。自己当时一堆标记判断是否可行,写的后面烦的不行,就不写了。。。
#include<bits/stdc++.h>
using namespace std;
const int N=1005;
const int dx[]={1,1,1,0,0,-1,-1,-1},dy[]={-1,0,1,-1,1,-1,0,1};
int n,m;
char s[N][N];
int check(int x,int y)
{
if(x<=1||x>=n||y<=1||y>=m)
return 0;
for(int i=0;i<8;i++)
if(s[x+dx[i]][y+dy[i]]!='#')
return 0;
return 1;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%s",s[i]+1);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(s[i][j]=='#')
{
int flag=0;
for(int k=0;k<8;k++)
flag|=check(i+dx[k],j+dy[k]);
if(!flag)
{
puts("NO");
return 0;
}
}
}
}
puts("YES");
return 0;
}
每次不找中心点,从边界点画圈找圈
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int inf = 0x3f3f3f3f;
const double eps = 1e-8;
const double PI = acos(-1);
#define pb push_back
#define mp make_pair
#define fi first
#define se second
const int N = 1005;
char s[N][N];
int main()
{
int n,m;
scanf("%d %d",&n,&m);
for(int i = 1;i <= n;++i){
scanf("%s",s[i] + 1);
}
bool flag = false;
for(int i = 1;i <= n - 2;++i){
for(int j = 1;j <= m - 2;++j){
if(s[i][j] != '.'){
bool ok = false;
for(int a = 0;a < 3 && !ok;++a){
for(int b = 0;b < 3 && !ok;++b){
if((a != 1 || b != 1) && s[i + a][j + b] == '.'){
ok = true;
break;
}
}
}
if(!ok){
for(int a = 0;a < 3;++a){
for(int b = 0;b < 3;++b){
if(a != 1 || b != 1){
//cout << a << " " << b << endl;
s[i + a][j+ b] = 'X';
//cout << i + a << " " << j + b << " " << s[i + a][j + b] << endl;
}
}
}
}
}
}
}
// for(int i = 1;i <= n;++i){
// for(int j = 1;j <= m;++j){
// cout << s[i][j];
// }
// cout << endl;
// }
for(int i = 1;i <= n;++i){
for(int j = 1;j <= m;++j){
if(s[i][j] == '#'){
printf("NO\n");
return 0;
}
}
}
printf("YES\n");
return 0;
}