## 学习总结2021-7-13
## 8:30 打开打卡签到。
## 9:30-13:00 刷vj二招题目。
## 15:00-19:30 刷vj二招题目
1 m题
给定一个正整数n,编写一个程序,找出一个非零乘以m的n,其十进制表示只包含数字0和1。你可以假设n不大于200,对应的m包含不超过100个十进制数字。
本题我直接暴力递归,直到找到相符的退出。
代码如下:
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int flag;
long long int n;
void ss(long long int i,int m)
{
if(m>=20||flag) return;
if(i%n==0){
flag=1;
printf("%lld\n",i);
return;
}
ss(i*10,m+1);
ss(i*10+1,m+1);
}
void main()
{
while(scanf("%lld",&n)!=EOF&&n){
flag=0;
ss(1,1);
}
return;
}
2.c题
在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。
思路和走迷宫类似,用递归依次往下找与上方不同列的,进入是将此列标注等出递归时再取消标注。
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int k,a[10];
long long int sum;
void ss(char s[][10],int i,int n,int m){
int j;
if(m==k) {sum++;return;}
for(;i<n;i++)
{
for(j=0;j<n;j++)
{
if(s[i][j]=='#'&&a[j]==0){
a[j]=1;
ss(s,i+1,n,m+1);
a[j]=0;
}
}
}
return;
}
void main()
{
char s[10][10];
int i,j,n;
while(scanf("%d%d",&n,&k)!=EOF)
{
if(n==-1&&k==-1) break;
sum=0;
for(i=0;i<n;i++)
a[i]=0;
for(i=0;i<n;i++)
{
scanf("%s",s[i]);
}
ss(s,0,n,0);
printf("%lld\n",sum);
}
return;
}
3.d题
牛牛子在地球过的不适应。现在,他想要回到母星牛牛星。假设地球和牛牛星都在一个坐标轴上,其中地球位于坐标n,而牛牛星位于坐标k。而牛牛子的飞船支持以下两种运动方式:
- 飞行:在一个时间单位中,能够从坐标x移动到x-1或x+1;
- 跃迁:在一个时间单位中,能够直接从x跃迁到2x。
现在,牛牛子想知道,他需要多长时间才能到达牛牛星?
此题我是暴力将所有存在的项层层入队,并依顺序去找,因为次数少的在前面所以可以以此找到。
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
void main()
{
long int a[100001],b[100001]={0},n,k,i,j;
scanf("%ld%ld",&n,&k);
a[0]=n;
b[n]=0;
if(n>k) printf("%ld\n",n-k);
else{
for(i=0,j=1;i<=100000;i++){
if(a[i]==k) break;
n=a[i]-1;
if(n>0&&n<=100000&&b[n]==0)
{
a[j]=n;
b[n]=b[a[i]]+1;
j++;
}
n=a[i]+1;
if(n>0&&n<=100000&&b[n]==0)
{
a[j]=n;
b[n]=b[a[i]]+1;
j++;
}
n=a[i]*2;
if(n>0&&n<=100000&&b[n]==0)
{
a[j]=n;
b[n]=b[a[i]]+1;
j++;
}
}
printf("%ld\n",b[a[i]]);
}
return;
}
写题出现的小毛病太多了,希望自己再接再厉,争取做的更好。