称量硬币 和 2016腾讯的蛇形矩形

这篇博客介绍了腾讯2016年提出的蛇形矩阵问题的C语言实现,通过分析找到了解决问题的关键规律。同时,文章还探讨了称量假币硬币的问题,利用分治法进行了解决。
摘要由CSDN通过智能技术生成

        腾讯2016蛇形矩阵C语言版实现,认真分析一下也不难,找到规律

   

#include <stdio.h>
#include <stdlib.h>

//全局变量
int count = 1;

void do_snack(int **matrix,int n);
void write_num_to_snack(int **matrix,int n,int start);
void print_snack(int **matrix,int n);



void do_snack(int **matrix,int n)
{
    int start = 0;
	//确定里面可以有多少个正方形,用这个循环卡,起始位置也就知道了
	while(n > start * 2){
	     write_num_to_snack(matrix,n,start);
		 start++;
	}//end while
}

void write_num_to_snack(int **matrix,int n,int start)
{
	int  i = 0;
    int  end_x = n - 1 - start;
	int  end_y = n - 1 - start;
    
	//从左向右
	for(i = start; i <= end_x; i++){
	      matrix[start][i]  = count++;
	}
    //从上到下
	for(i = start + 1; i <= end_y;i++){
	      matrix[i][end_y] = count++; 
	}
	//从右到左
	for(i = end_y - 1; i >= start;i--){
	      matrix[end_y][i] = count++;
	}
	//从下到上
	for(i = end_y - 1; i >= start +1 ;i--){
	      matrix[i][start] =  count++;
	}
} 

void print_snack(int **matrix,int n)
{
	int i = 0;
	int j = 0;
	
	for(i = 0; i < n;i++){
		for(j = 0;j < n;j++){
			printf("%4d ",matrix[i][j]);
		}
	    printf("\n");
	}// end for
}


int main(int argc,char *argv[])
{
	int i = 0;
	int n = 0;;
    int **matrix = NULL;
	
	scanf("%d",&n);
	matrix = (int **)malloc(sizeof(int *)*n);

	for(i = 0; i < n;i++){
	    matrix[i] = (int *)malloc(sizeof(int) * n);
	}//end for

    do_snack(matrix,n);

	print_snack(matrix,n);
    
	return 0;
}


称量假币硬币问题,这是用分治法求解的

#include <stdio.h>
#include <stdlib.h>
#include <time.h>


#define  ARRAY_SIZE   (16)
#define  TRUE         (1)
#define  FALSE        (0)


//计算第几次比较
int call_time = 0;

// 生成包含 'N' 个硬币重量的数组( 含 1 枚伪币 ), 并返回伪币位置 ...
int create_random_coinweight_array(int *p,int N)
{
	int i = 0;
	int kt = 0;
	int is_stop = FALSE;
	int true_coinweight = 0;
	int fake_coinweight = 0;
	
	// 生成随机数种子 ...
	srand((unsigned)time(NULL));

	 // 生成随机真币重量值( 在 50 至 100 之间 ) ...
	true_coinweight = 50 + rand()%(100 - 50);

	// 生成随机伪币位置( 在 0 ~ N-1 之间 ) ...
	kt = rand()%N;


	for(i = 0; i < N; i++){
		if(i != kt ){
		     *(p + i) = true_coinweight;
		}
	}//end for

	// 生成 1 个比真币略轻的伪币重量值 .
    while(!is_stop){
	   fake_coinweight = 50 + rand()%(100 - 50);
	   if((true_coinweight > fake_coinweight) && 
		   (true_coinweight - fake_coinweight <= 5)){
	        is_stop = TRUE;
			*(p + kt) = fake_coinweight;
	   }
	}//end while

	return kt;
} 
// 计算数组中硬币重量和 ...
int calc_coin_total_weight(int array[],int kb,int ke)
{
	int i = 0;
	int total_weight = 0;
	
	for( i = kb; i <= ke;i++){
	    total_weight += array[i];
	}//end for 

	return total_weight;
}

int find_fake_coin(int array[],int kb,int ke)
{
	int left_weight = 0;
	int right_weight = 0;
	
	call_time++;

	printf("< 第 %d 次查找 > \n",call_time);

	// 采用分治法找到伪币( 假定伪币一定存在且只有 1 枚 ) ...
    // kb - (子)数组左边界( begin )
    // ke - (子)数组右边界( end )
    left_weight  = calc_coin_total_weight(array,kb,kb+(ke-kb)/2);
	right_weight = calc_coin_total_weight(array,kb+(ke-kb)/2 + 1,ke);

	if(left_weight < right_weight){
	       if(ke - kb == 1){
		      return kb;
		   }else{
		      find_fake_coin(array,kb,kb+(ke-kb)/2);
		   }
	}else{
		   if(ke - kb == 1){
		       return ke;
		   }else{
		       find_fake_coin(array,kb+(ke-kb)/2+1,ke);
		   }
	}

	//return -1;

}


//主函数
int main(int argc,char *argv[])
{
    int array[ARRAY_SIZE] = {0};
	int i = 0;
	int k = 0;
	int fake_coin_position = -1;

	k = create_random_coinweight_array(array,ARRAY_SIZE);

	 printf( "< 生成的硬币重量数组值为( 含 1 枚伪币 ) > : \n" );

	for(i = 0; i < ARRAY_SIZE;i++){
	     printf("%d\n",array[i]);
	}//end for 
    printf("\n");
	printf("<>");
	printf("\n");

	fake_coin_position = find_fake_coin(array,0,ARRAY_SIZE - 1);

	printf( "< 找到第 %d 枚为伪币 > \n", ( fake_coin_position + 1 ) );
    printf( "\n" );

    // 等待用户输入任意一键返回 ...
    system( "PAUSE" );
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值