蓝桥杯B组2012 C++ 奇怪的比赛+方阵旋转

蓝桥杯B组2012 C++ 奇怪的比赛+方阵旋转 The fourth day


奇怪的比赛

 某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:每位选手需要回答10个 问题(其编号为1到10),越后面越有难度。
 答对的,当前分数翻倍;答错了 则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。每位选手都有 个起步的分数为10分。
某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他(她)哪个    题目答对了,哪个题目答错了吗?
 如果把答对的记为1,答错的记为0,则10个题目的回答情况可以用仅含有1和0的串来表示。例如:0010110011 就是可能的情况。
 你的任务是算出所有可能情况。每个答案占一行。

本次题目最主要的找出所有的十位的二进制数,方法有很多,无符号的十位的二进制数最大就是 2 10 2^{10} 210-1,可以把这些数字的十进制数转换为二进制,然后转换成字符数组,然后每位遍历。
我使用next_permutation(), 让每个(0,1) 排列进行组合。

#include<iostream>
#include<algorithm>
using namespace std;
int main() {
	int a[20]={0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1};
	int b[11];
	int c=10,i;
	do{
		b[0]=a[0];
		do{
			b[1]=a[2];
			do{
				b[2]=a[4];
				do{
					b[3]=a[6];
					do{
						b[4]=a[8];
						do{
							b[5]=a[10];
							do{
								b[6]=a[12];
								do{
									b[7]=a[14];
									do{
										b[8]=a[16];
										do{
											b[9]=a[18];
											c=10;
											for(i=0;i<10;i++){
												if(b[i]==1)
													c*=2;
												else
													c=c-i-1;
											}
											if(c==100){
												for(i=0;i<10;i++)
													cout<<b[i]<<'\t'; 
												cout<<endl;
											}
											/*for(i=0;i<10;i++)
													cout<<b[i]<<'\t';
													cout<<endl;*/
										}while(next_permutation(a+18,a+20));
									}while(next_permutation(a+16,a+18));
								}while(next_permutation(a+14,a+16));
							}while(next_permutation(a+12,a+14));
						}while(next_permutation(a+10,a+12));
					}while(next_permutation(a+8,a+10));
				}while(next_permutation(a+6,a+8));
			}while(next_permutation(a+4,a+6));
		}while(next_permutation(a+2,a+4));
	}while(next_permutation(a,a+2));	
	return 0;
}

在这里插入图片描述


方阵旋转

对一个方阵转置,就是把原来的行号变列号,原来的列号变行号例如,如下的方阵:
1 2  3  4
5 6  7  8
9 10 11 12
13 14 15 16
转置后变为:
1 5  9 13
2 6 10 14
3 7 11 15
4 8 12 16
但,如果是对该方阵顺时针旋转(不是转置),却是如下结果:
13  9  5  1
14 10  6  2
15 11  7  3
16 12  8  4
下面的代码实现的功能就是要把一个方阵顺时针旋转。
请填写划线部分缺失的代码。
注意:只填写划线部分的代码,不要填写任何多余的内容。比如已经存在的小括号,注 释或说明文字等
void rotate(int* x, int rank)
{
	int* y = (int*)malloc(___sizeof(int)*16________________);  // 填空
 
	for(int i=0; i<rank * rank; i++)
	{
		y[_________(i%4)*rank+3-(i/4)________________] = x[i];  // 填空
	}
 
	for(int i=0; i<rank*rank; i++)
	{
		x[i] = y[i];
	}
 
	free(y);
}
 
int main(int argc, char* argv[])
{
	int x[4][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
	int rank = 4;
 
	rotate(&x[0][0], rank);
 
	for(int i=0; i<rank; i++)
	{
		for(int j=0; j<rank; j++)
		{
			printf("%4d", x[i][j]);
		}
		printf("\n");
	}
 
	return 0;
}
 答案: sizeof(int)*16   
 (i%4)*rank+3-(i/4)      

在这里插入图片描述


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值