AtCoder - abc322_d

终于补出来了!

#include<bits/stdc++.h>

using namespace std;
int n, m, k, T;
char t[5][5];
char ex[5][5][5];
char h[5][5][5];
int flag;
int n1[5];
int n2[5];
bool check(int idx, int x, int y){
	for(int i = 1; i <= 4; i++){
		for(int j = 1; j <= 4; j++){
			if(ex[idx][i][j] == '#' && (i + x < 1 || i + x > 4 || j + y < 1 || j + y > 4))
				return 0;
		}
	}
	return 1;
}
void change(int idx){
	memcpy(t, ex[idx], sizeof t);
	for(int i = 1; i <= 4; i++){
		for(int j = 1; j <= 4; j++){
			ex[idx][i][j] = t[4 - j + 1][i]; // 旋转90度 
		}
	}
}
void dfs(int idx){
	if(idx >= 4){
		memset(t, 0, sizeof t);
		for(int e = 1; e <= 3; e++){
			for(int i = 1; i <= 4; i++){
				for(int j = 1; j <= 4; j++){
					if(ex[e][i][j] == '#'){
						t[i + n1[e]][j + n2[e]] += 1; // 好大的一个坑,刚开始写成了 t[i + n1[e]][j + n2[e]] = 1; 忘了不能覆盖 
					}
				}
			}
		}
		for(int i = 1; i  <= 4; i++){
			for(int j = 1;  j <= 4; j++){
				if(t[i][j] != 1){
					return ;
				}
			}
		}
		flag = 1;
		return ;
	}
	for(int e = 1; e <= 4; e++){  // 因为要旋转3次 
		for(int i = -3; i <= 3; i++){
			for(int j = -3; j <= 3; j++){
				if(check(idx, i, j)){
					n1[idx] = i;
					n2[idx] = j;
					dfs(idx + 1);
				}
			}
		} 
		change(idx);
	}	
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	for(int t = 1;  t <= 3; t++){
		for(int i = 1; i <= 4; i++){
			for(int j = 1; j <= 4; j++){
				cin>>ex[t][i][j]; 
			}
		}
	}
	dfs(1);
	if(flag){ // 全局变量  
		cout<<"Yes\n";
	}
	else cout<<"No\n";
	return 0;
} 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

H ook

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值