Lección 1 Recursión y ejemplo de recursión AcWing 95. Interruptores desconcertantes

Lección 1 Recursión y ejemplo de recursión AcWing 95. Interruptores desconcertantes

Enlace al título original

AcWing 95. Interruptores desconcertantes

Etiqueta de algoritmo

operaciones recursivas de bits

tren de pensamiento

Inicialmente, el estado de todas las luces (la operación de conmutación centrada en la luz) es indeterminado, por lo que el interruptor de la primera fila está pendiente, y el 0 de la primera fila se puede cambiar por su propio interruptor o por la segunda fila La luz en la posición correspondiente (abajo).
Por lo tanto, enumere si la operación del interruptor de la primera fila está activa o no. Presione 00000 binario para indicar ninguna operación y 11111 para indicar todas las operaciones.
Después de la operación de la primera fila se confirma, 01 en la primera fila El estado está determinado, por lo que el 0 en la primera fila solo se puede cambiar a través de la posición correspondiente de la segunda fila.Después de que el 0 en la primera fila cambie
a 1 a través de la operación ligera de la segunda fila, se determina el estado de la primera fila. Luego, la segunda fila no puede cambiar el 0 de la segunda fila a 1 a través de su propia operación de transformación de lámpara (de lo contrario, afectará a la primera fila), y solo puede cambiarse por la posición relativa de la operación de la lámpara de la tercera fila, y así sucesivamente
Hasta que se confirme el estado 01 de la cuarta línea, ya que no hay una sexta línea para operar la quinta línea, se confirma el estado de la quinta línea, por lo que la quinta línea es
finalmente juzgado Cuando la quinta línea es todo 1, significa que el estado de la primera línea (por ejemplo, 01110) es válido para todos los cambios posteriores

el código

#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;
}

referencias

AcWing 95. Cambio inexplicable y explicación general

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/T_Y_F_/article/details/130277851
Recomendado
Clasificación