2016年省赛A组C++
A、网友年龄 等式求解
某君新认识一网友。当问及年龄时,他的网友说:
“我的年龄是个2位数,我比儿子大27岁,如果把我的年龄的两位数字交换位置,刚好就是我儿子的年龄”。请你计算:网友的年龄一共有多少种可能情况?提示:30岁就是其中一种可能哦。
7:按规则找[10,99]的数
int main(){
int cnt=0,t;
for (int i=10;i<100;i++){
t = (i%10)*10+i/10;
if (i-t==27) cnt+=1;
}
cout<<cnt<<endl;
return 0;
}
B、生日PARTY 等式求解
某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。现在算起来,他一共吹熄了236根蜡烛。请问,他从多少岁开始过生日party的?
26:根据规则双重for循环
int main(){
int sum;
for (int i=1;i<100;i++){//从第i岁过
sum=0;
for (int j=i;j<100;j++){
sum+=j;
if (sum==236) cout<<i<<" "<<j<<endl;
}
}
return 0;
}
C、方格填数 dfs+满足约束条件
如下的10个格子填入0~9的数字。
要求:连续的两个数字不能相邻。(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
1580:方格标号为1-10,就逐个设置约束条件,dfs搜索填满后满足条件的情况
思路来自大佬的dfs暴力,毕竟我写不出来bfs。。。
int cnt=0,gezi[11],visit[11];
void dfs(int x){
if(x==11){//填完
if(abs(gezi[1]-gezi[2])>1&&abs(gezi[1]-gezi[4])>1&&abs(gezi[1]-gezi[5])>1&&abs(gezi[1]-gezi[6])>1&&
abs(gezi[2]-gezi[3])>1&&abs(gezi[2]-gezi[5])>1&&abs(gezi[2]-gezi[6])>1&&abs(gezi[2]-gezi[7])>1 &&
abs(gezi[3]-gezi[6])>1&&abs(gezi[3]-gezi[7])>1&&
abs(gezi[4]-gezi[5])>1&&abs(gezi[4]-gezi[8])>1&&abs(gezi[4]-gezi[9])>1&&
abs(gezi[5]-gezi[6])>1&&abs(gezi[5]-gezi[8])>1&&abs(gezi[5]-gezi[9])>1&&abs(gezi[5]-gezi[10])>1&&
abs(gezi[6]-gezi[7])>1&&abs(gezi[6]-gezi[9])>1&&abs(gezi[6]-gezi[10])>1&&
abs(gezi[7]-gezi[10])>1&&
abs(gezi[8]-gezi[9])>1&&
abs(gezi[9]-gezi[10])>1) //满足约束条件
cnt+=1;
}
for(int i=0;i<10;i++){//每个位置每个数试一次
if(!visit[i]){
visit[i]=1;
gezi[x]=i;//填数
dfs(x+1);//深搜
visit[i]=0;
}
}
}
int main(){
dfs(1);
cout<<cnt;
return 0;
}
D、是代码填空题