2016年填空

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、是代码填空题

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值