P9122题解
一道大暴力。
话说 USACO 是不是和 CCF 学的赛时放那么恶心的题。
回归正题:
由于格子只会由白变黑,不会由黑变白。
所以直接枚举 4 个方向判断有没有不应该黑的格子黑了(注意不是错了因为后面还可以印)。
代码实现:
#include<bits/stdc++.h>
using namespace std;
#define neverTLE ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define reg register
#define endl '\n'
int t,n,k;
int main(){
neverTLE;
cin>>t;
while(t--){
cin>>n;
char mp[30][30]={0},st[30][30]={0},bd[30][30]={0};
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>mp[i][j];
}
}
cin>>k;
for(int i=1;i<=k;i++){
for(int j=1;j<=k;j++){
cin>>st[i][j];
}
}
for(int i=1;i+k-1<=n;i++){
for(int j=1;j+k-1<=n;j++){
bool flag=1;
for(int ii=i,iii=1;ii<=i+k-1;ii++,iii++){
for(int jj=j,jjj=1;jj<=j+k-1;jj++,jjj++){
if(mp[ii][jj]!=st[iii][jjj]&&mp[ii][jj]=='.'){
flag=0;
}
}
}
if(flag){
for(int ii=i,iii=1;ii<=i+k-1;ii++,iii++){
for(int jj=j,jjj=1;jj<=j+k-1;jj++,jjj++){
if(bd[ii][jj]!='*') bd[ii][jj]=st[iii][jjj];
}
}
}
flag=1;
for(int ii=i,jjj=k;ii<=i+k-1;ii++,jjj--){
for(int jj=j,iii=1;jj<=j+k-1;jj++,iii++){
if(mp[ii][jj]!=st[iii][jjj]&&mp[ii][jj]=='.'){
flag=0;
}
}
}
if(flag){
for(int ii=i,jjj=k;ii<=i+k-1;ii++,jjj--){
for(int jj=j,iii=1;jj<=j+k-1;jj++,iii++){
if(bd[ii][jj]!='*')bd[ii][jj]=st[iii][jjj];
}
}
}
flag=1;
for(int ii=i,iii=k;ii<=i+k-1;ii++,iii--){
for(int jj=j,jjj=k;jj<=j+k-1;jj++,jjj--){
if(mp[ii][jj]!=st[iii][jjj]&&mp[ii][jj]=='.'){
flag=0;
}
}
}
if(flag){
for(int ii=i,iii=k;ii<=i+k-1;ii++,iii--){
for(int jj=j,jjj=k;jj<=j+k-1;jj++,jjj--){
if(bd[ii][jj]!='*') bd[ii][jj]=st[iii][jjj];
}
}
}
flag=1;
for(int ii=i,jjj=1;ii<=i+k-1;ii++,jjj++){
for(int jj=j,iii=k;jj<=j+k-1;jj++,iii--){
if(mp[ii][jj]!=st[iii][jjj]&&mp[ii][jj]=='.'){
flag=0;
}
}
}
if(flag){
for(int ii=i,jjj=1;ii<=i+k-1;ii++,jjj++){
for(int jj=j,iii=k;jj<=j+k-1;jj++,iii--){
if(bd[ii][jj]!='*') bd[ii][jj]=st[iii][jjj];
}
}
}
}
}
int flagg=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(bd[i][j]!=mp[i][j]&&mp[i][j]=='*'){
flagg=1;
goto jump;
}
}
}
jump:
/*for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<bd[i][j]<<' ';
}
cout<<endl;
}
*/
if(flagg){
cout<<"NO"<<endl;
}
else{
cout<<"YES"<<endl;
}
}
return 0;
}