【vijos】P1016北京2008的挂钟

看了一下题解,还是没有看懂,打算重新学习一下搜索与剪枝的知识……

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>

using namespace std;
int a[10],b[10][10]={{0},
                     {0,1,1,0,1,1,0,0,0,0},
                     {0,1,1,1,0,0,0,0,0,0},
                     {0,0,1,1,0,1,1,0,0,0},
                     {0,1,0,0,1,0,0,1,0,0},
                     {0,0,1,0,1,1,1,0,1,0},
                     {0,0,0,1,0,0,1,0,0,1},
                     {0,0,0,0,1,1,0,1,1,0},
                     {0,0,0,0,0,0,0,1,1,1},
                     {0,0,0,0,0,1,1,0,1,1}},s=0,m=1000000,c[10],d[10],e[10];
void find()
{
     for(c[1]=0;c[1]<=3;c[1]++)
       for(c[2]=0;c[2]<=3;c[2]++)
         for(c[3]=0;c[3]<=3;c[3]++)
           for(c[4]=0;c[4]<=3;c[4]++)
             for(c[5]=0;c[5]<=3;c[5]++)
               for(c[6]=0;c[6]<=3;c[6]++)
                 for(c[7]=0;c[7]<=3;c[7]++)
                   for(c[8]=0;c[8]<=3;c[8]++)
                     for(c[9]=0;c[9]<=3;c[9]++)
                     {
                         bool flag=true;
                         for (int i=1; i<=9; i++) a[i]=d[i];//重置
                         for (int i=1; i<=9; i++)
                         {
                             for (int j=1; j<=9; j++) a[i]+=c[j]*b[j][i];
                             a[i]%=4;
                             if (a[i]!=0) {flag=false; break;} 
                         }
                         if (flag)
                         {
                            int ss=0;
                            for (int i=1; i<=9; i++) ss+=c[i];
                            if (ss<m) ss=m;
                            for(int i=1; i<=9; i++) e[i]=c[i];
                         }
                     }
}
int main()
{
    for(int i=1; i<=9; i++)
    {
        cin>>a[i];
        d[i]=a[i]; 
    }
    find();
    bool flag=false;
    for(int i=1;i<=9;i++)
      for(int j=1; j<=e[i]; j++)
      {
              if(flag) cout<<" "; else flag=true;
              cout<<i;
      }
    return 0;
}

对与功能函数的学习

void find()
{
     for(c[1]=0;c[1]<=3;c[1]++)
       for(c[2]=0;c[2]<=3;c[2]++)
         for(c[3]=0;c[3]<=3;c[3]++)
           for(c[4]=0;c[4]<=3;c[4]++)
             for(c[5]=0;c[5]<=3;c[5]++)
               for(c[6]=0;c[6]<=3;c[6]++)
                 for(c[7]=0;c[7]<=3;c[7]++)
                   for(c[8]=0;c[8]<=3;c[8]++)
                     for(c[9]=0;c[9]<=3;c[9]++)//枚举所有方案的可能
                     {
                         bool flag=true;
                         for (int i=1; i<=9; i++) a[i]=d[i];//重置,将a数组重置为初始状态
						 
                         for (int i=1; i<=9; i++)
                         {
                             for (int j=1; j<=9; j++) a[i]+=c[j]*b[j][i];//累计该挂钟所有可能的方案数
                             a[i]%=4;
							 
                             if (a[i]!=0)
							 {flag=false; break;} //没有一种方案数能使该挂钟归0,这种方案不可行
                         }
						 
                         if (flag)//记录方案
                         {
                            int ss=0;
                            for (int i=1; i<=9; i++) ss+=c[i];
                            if (ss<m) ss=m;
                            for(int i=1; i<=9; i++) e[i]=c[i];
                         }
                     }
}
重复看了许多次之后,终于明白了,数组C表示的是方案数(用了i方案多少次)

相当于是枚举的所有可能存在的方案数,一一判断可行性,真是相当的暴力

只不过那个ss和m到底是什么意思,还是没看懂

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值