Codeforces Round #514 (Div. 2) B. Forgery

地址: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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值