1 条题解

  • 0
    @ 2026-5-18 22:01:16

    一道大暴力

    话说 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;
    }
    
    • 1

    信息

    ID
    6983
    时间
    2000ms
    内存
    256MiB
    难度
    6
    标签
    递交数
    28
    已通过
    12
    上传者