Cours 1 Récursivité et exemple de récursivité AcWing 95. Commutateurs déroutants
Lien vers le titre original
AcWing 95. Commutateurs déroutants
Libellé de l'algorithme
opérations récursives sur les bits
train de pensée
Initialement, l'état de toutes les lumières (l'opération de commutation centrée sur la lumière) est indéterminé, donc l'interrupteur de la première rangée est en attente, et le 0 de la première rangée peut être changé par son propre interrupteur ou par la deuxième rangée La lumière à la position correspondante (ci-dessous) est modifié.
Par conséquent, énumérez si l'opération de commutation de la première rangée est active ou non. Appuyez sur le binaire 00000 pour indiquer aucune opération, et 11111 pour indiquer toutes les opérations.
Après l'opération de la première rangée est confirmé, 01 dans la première ligne L'état est déterminé, de sorte que le 0 dans la première ligne ne peut être changé que par la position correspondante de la deuxième ligne Après que le 0 dans la première ligne
passe à 1 par l'actionnement léger de la seconde rangée, l'état de la première rangée est déterminé. Ensuite, la deuxième rangée ne peut pas changer le 0 de la deuxième rangée en 1 par sa propre opération de transformation de lampe (sinon cela affectera la première rangée), et ne peut être changé que par la position relative du fonctionnement de la lampe de la troisième rangée, et ainsi de suite
. Jusqu'à ce que l'état 01 de la quatrième ligne soit confirmé, puisqu'il n'y a pas de sixième ligne pour faire fonctionner la cinquième ligne, l'état de la cinquième ligne est confirmé, de sorte que la cinquième ligne est
Lorsque la cinquième ligne est entièrement à 1, cela signifie que le Statut de la première ligne (par exemple 01110) est valable pour toutes les modifications ultérieures
le code
#include<bits/stdc++.h>
#define int long long
#define rep(i, a, b) for(int i=a;i<b;++i)
#define Rep(i, a, b) for(int i=a;i>b;--i)
#define x first
#define y second
#define ump unordered_map
#define pq priority_queue
#define pb push_back
using namespace std;
typedef pair<int, int> PII;
const int N=6;
char g[N][N], back[N][N];
int dx[5]={-1, 0, 1, 0, 0}, dy[5]={0, 1, 0, -1, 0};
inline int rd(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
void put(int x) {
if(x<0) putchar('-'),x=-x;
if(x>=10) put(x/10);
putchar(x%10^48);
}
void turn(int x, int y){
rep(i, 0, 5){
int xx=x+dx[i], yy=y+dy[i];
// if(xx>0&&xx<5&&yy>=0&&yy<5){
// g[xx][yy]^=1;
// }
if(xx<0||xx>=5||yy<0||yy>=5){
continue;
}
g[xx][yy]^=1;
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t=rd();
while(t--){
rep(i, 0, 5){
scanf("%s", g[i]);
}
int res=7;
rep(i, 0, 1<<5){
memcpy(back, g, sizeof g);
int cnt=0;
rep(j, 0, 5){
if(i>>j&1){
cnt++;
turn(0, 4-j);
}
}
rep(j, 0, 4){
rep(k, 0, 5){
if(g[j][k]=='0'){
cnt++;
turn(j+1, k);
}
}
}
bool suc=false;
rep(j, 0, 5){
if(g[4][j]=='0'){
suc=true;
break;
}
}
if(!suc){
res=min(res, cnt);
}
memcpy(g, back, sizeof g);
}
if(res>6){
res=-1;
}
printf("%lld\n", res);
}
return 0;
}
les références
AcWing 95. Commutateur inexplicable y explication générale