[vijos 1197] 费解的开关 {深搜+递推}

题目

https://www.vijos.org/p/1197


解题思路

先深搜出第一行的所有情况(对于每一盏灯都可选或不选),然后递推第一层到第四层,如 a[i][j] a [ i ] [ j ] 为0,则点 a[i+1][j] a [ i + 1 ] [ j ] 。然后判断最后一层,以求是否合法。


代码

#include
#include
#include
using namespace std; 
const int inf=1e8; 
int n,a[7][7],b[7][7],ans=inf; 
int ddfs(int g)
{
    int gg=g; 
    for (int i=1;i<=5;i++)
     for (int j=1;j<=5;j++)
      b[i][j]=a[i][j]; 
    for (int i=1;i<=4;i++)
     for (int j=1;j<=5;j++)
      if (!b[i][j])
      {
        b[i][j]^=1; b[i+1][j]^=1; b[i+1][j-1]^=1; b[i+1][j+1]^=1; 
        b[i+2][j]^=1; gg++; 
      }
    for (int i=1;i<=5;i++)
     if (!b[5][i]) return inf; 
     return gg; 
}
void dfs(int k,int g)
{
    if (k==6) {
     ans=min(ans,ddfs(g));  
     return; 
    }
    a[1][k]^=1; a[2][k]^=1; a[1][k-1]^=1; a[1][k+1]^=1; 
    dfs(k+1,g+1); 
    a[1][k]^=1; a[2][k]^=1; a[1][k-1]^=1; a[1][k+1]^=1; 
    dfs(k+1,g); 
}
int main()
{
    scanf("%d",&n); 
    while (n--)
    {
      memset(a,0,sizeof(a));        
      ans=1e6; 
      for (int i=1;i<=5;i++)
       for (int j=1;j<=5;j++)
        scanf("%1d",&a[i][j]); 
      dfs(1,0); 
      if (ans<=6) printf("%d\n",ans); else printf("-1\n");  
    }
}

你可能感兴趣的:(数据结构(/堆排序/桶/数),暴力(/模拟/字符串处理))