1. 程式人生 > 其它 >CF389B Fox and Cross

CF389B Fox and Cross

洛谷題面

題目大意

有一個 \(n\times n\) 的矩陣,每個點為 .# ,問該矩陣是否能夠分解成多個如下圖的由 # 組成的十字形:

x # x
# # #
x # x

x 表示任意字母。

題目分析

直接模擬。

讀入字元陣列後,按順序遍歷每個點,判斷該點是否為十字形,如果是,則把它們改為 .,這樣就避免了重複的問題。

當然也可以用一個標記陣列來表示該十字形是夠被算過。

注意一下邊界問題即可。

程式碼

//2021/11/17

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>

#include <cstdio>

#include <climits>//need "INT_MAX","INT_MIN"

#define enter() putchar(10)

#define debug(c,que) cerr<<#c<<" = "<<c<<que

#define cek(c) puts(c)

#define blow(arr,st,ed,w) for(register int i=(st);i<=(ed);i++)cout<<arr[i]<<w;

#define speed_up() std::ios::sync_with_stdio(false)

namespace Newstd
{
	inline int read()
	{
		char c;
		bool flag=false;
		while((c=getchar())<'0' || c>'9')
		{
		    if(c=='-') flag=true;
		}
		int res=c-'0';
		while((c=getchar())>='0' && c<='9')
		{
		    res=(res<<3)+(res<<1)+c-'0';
		}
		return flag?-res:res;
	}
	inline void print(int x)
	{
		if(x<0)
		{
			putchar('-');x=-x;
		}
		if(x>9)
		{
			print(x/10);
		}
		putchar(x%10+'0');
	}
}

using namespace Newstd;

using namespace std;

const int ma=105;

char mp[ma][ma];

int n;

inline bool calc(int x,int y)
{
	return (mp[x][y]=='#' && mp[x-1][y]=='#' && mp[x+1][y]=='#' && mp[x][y-1]=='#' && mp[x][y+1]=='#');
}

inline void solve(int x,int y)
{
	mp[x][y]=mp[x-1][y]=mp[x][y-1]=mp[x+1][y]=mp[x][y+1]='.';
}

int main(void)
{
	n=read();
	
	for(register int i=0;i<n;i++)
	{
		scanf("%s",mp[i]);
	}
	
	for(register int i=1;i<n-1;i++)
	{
		for(register int j=1;j<n-1;j++)
		{
			if(calc(i,j)==true)
			{
				solve(i,j);
			}
		}
	}
	
	for(register int i=0;i<n;i++)
	{
		for(register int j=0;j<n;j++)
		{
			if(mp[i][j]=='#')
			{
				puts("NO");
				
				return 0;
			}
		}
	}
	
	puts("YES");
	
	return 0;
}