CF389B Fox and Cross
阿新 • • 發佈:2021-11-17
題目大意
有一個 \(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; }