【vijos】P1016北京2008的挂钟
2014-06-10 21:53
260 查看
看了一下题解,还是没有看懂,打算重新学习一下搜索与剪枝的知识……
#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到底是什么意思,还是没看懂
#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到底是什么意思,还是没看懂
相关文章推荐
- Vijos P1016北京2008的挂钟
- Vijos——T 1016 北京2008的挂钟 || 洛谷—— P1213 时钟
- vijosP1016 北京2008的挂钟
- Vijos1016.北京2008的挂钟
- Vijos P1016 钟表问题 BFS+剪枝
- vijos P1016 北京2008的挂钟(poj 1166)
- vijosP1016 北京2008的挂钟
- 北京2008中国代表团名单
- vijos 1112 小胖的奇偶 并查集+哈希表
- Vijos P_1002 过河 状态优化dp
- 新年趣事之打牌----VIJOS_1071----01背包加强版
- vijos p1104(采药)(0-1背包)
- vijos1071【动态规划】
- vijosP1016北京2008的挂钟 BFS + 优先队列
- Vijos 1303
- VIJOS-P1401-复制CS
- 1090. [Vijos 1071] 新年趣事之打牌
- NEU 1212 VIJOS-P1037
- NOIP 2011 提高组 选择客栈(vijos 1737)(方法:队列,数学)
- VIJOS 1143 三方格取数