您的位置:首页 > 其它

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

2016-04-06 20:29 162 查看
       
腾讯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;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: