1.两种生物
2.填数字(暴力)
答案:21978
3.海盗喝酒
#include<stdio.h>
int main()
{
int a,b,c,d;
for(a=20; a>=4; a--)
for(b=a-1; b>=3; b--)
for(c=b-1; c>=2; c--)
for(d=c-1; d>=1; d--)
if(1.0/a+1.0/b+1.0/c+1.0/d==1.0)
printf("%d,%d,%d,%d,0\n",a,b,c,d);
return 0;
}
4.电视答题
开一个十层的循环,由于每种情况只有两种选择,所以这种方式是可行的。
#include<stdio.h>
int main()
{
int mark;
int a[10];
for(a[1]=0; a[1]<=1; a[1]++)
for(a[2]=0; a[2]<=1; a[2]++)
for(a[3]=0; a[3]<=1; a[3]++)
for(a[4]=0; a[4]<=1; a[4]++)
for(a[5]=0; a[5]<=1; a[5]++)
for(a[6]=0; a[6]<=1; a[6]++)
for(a[7]=0; a[7]<=1; a[7]++)
for(a[8]=0; a[8]<=1; a[8]++)
for(a[9]=0; a[9]<=1; a[9]++)
for(a[10]=0; a[10]<=1; a[10]++)
{
mark=10;
for(int i=1; i<=10; i++)
{
if(a[i]==0)
mark-=i;
else
mark*=2;
}
if(mark==100)
{
for(int i=1; i<=10; i++)
printf("%d",a[i]);
printf("\n");
}
}
return 0;
}
第五题:矩阵的转置
实现把矩阵顺时针旋转
答案:
rank*rank*sizeof(int );
rank*(i%rank+1)-i/rank-1;(不太会)
第六题:分块乘法题
第一空,看懂题目的图片就可以写出来:
n3/base+n2/base+n1%base;
第二空,处理进制的问题
r[2]/base;
第七题:填旗子
第一空,简单的判断
if(NumRow!=3||NumCol!=3)
第二空,递归
f(x,r,c+1)
第三空,
x[r][c];
第八题:银行密码(模拟题目)
简单的模拟题
#include<iostream>
#include<string.h>
#define maxn 110
using namespace std;
char a[maxn];
char b[20][6];
int change(int x){
while(x>9){
int temp=x;
int sum=0;
while(temp>0){
sum+=temp%10;
temp/=10;
}
x=sum;
}
return x;
}
int main(){
int n;
cin>>n;
while(n--){
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
scanf("%s",a);
int l=strlen(a),q=0;
for(int i=0;i<l;i+=6){
b[q++][0]=a[i]-'a'+97;
if(a[i+1]=='\n')
break;
else
b[q-1][1]=a[i+1]-'a'+97;
if(a[i+2]=='\n')
break;
else
b[q-1][2]=a[i+2]-'a'+97;
if(a[i+3]=='\n')
break;
else
b[q-1][3]=a[i+3]-'a'+97;
if(a[i+4]=='\n')
break;
else
b[q-1][4]=a[i+4]-'a'+97;
if(a[i+5]=='\n')
break;
else
b[q-1][5]=a[i+5]-'a'+97;
}
int sum[6];
memset(sum,0,sizeof(sum));
for(int i=0;i<6;i++){
for(int j=0;j<6;j++){
sum[i]+=b[j][i];
}
}
for(int i=0;i<6;i++){
if(sum[i]>9){
sum[i]=change(sum[i]);
}
}
for(int i=0;i<6;i++)
cout<<sum[i];
cout<<endl;
}
return 0;
}
第九题:足球比赛的胜负
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
double cas[3];
memset(cas,0,sizeof(cas));
//甲对乙,甲必须胜
//丙对丁:丙胜,甲对丙,甲胜+丁胜,甲对丁,甲胜
cas[0]=0.1*0.2*0.3+0.1*0.8*0.5;
//甲对丙,甲必须胜
//乙对丁:乙胜,甲对乙,甲胜+丁胜,甲对丁,甲胜
cas[1]=0.3*0.4*0.1+0.3*0.6*0.5;
//甲对丁,甲必须胜
//乙对丙:乙胜,甲对乙,甲胜+丙胜,甲对丙,甲胜
cas[2]=0.5*0.7*0.1+0.5*0.3*0.3;
//下面进行十万次模拟
int i,t;
double sum=0.0;
for(i =0; i<100000; i++)
{
t=rand()%3;
if(t==0)
sum+=cas[0];
if(t==1)
sum+=cas[1];
if(t==2)
sum+=cas[2];
}
printf("%lf\n",sum/100000);
return 0;
}
第十题:博弈
这是一道博弈的题目。我自己写的时候写错了,我直接用的dfs,dfs可以用来求解有无可能让a获胜,而题目要求的是两个人足够聪明,会想办法让自己赢。
别人的代码:
#include <string.h>
#include <stdio.h>
int op[4]= {1,3,7,8};//四种操作
int main()
{
int n,a[10000],m;
memset(a,0,sizeof(a));//先都初始化为0
for(int i=1; i<10000; i++)//用i表示球的数量
for(int j=0; j<4; j++)//四种情况一一判断,一旦发现一个可以使A获胜的取法就可以了。
if(i-op[j]>0)//首先保证在这种情况下有足够球可取
{
if(a[i-op[j]]==0)//A取完,剩下的球让B来取,已经没有胜利的可能(此时可以看做对于i-op[j]个球是B先取,为0表示B只能失败)
{
a[i]=1;//i个球A先取的情况A可以取胜
break;
}
}
scanf("%d",&n);
while(n--)
{
scanf("%d",&m);
printf("%d\n",a[m]);
}
return 0;
}
当时我写错了的:
#include<iostream>
using namespace std;
int n,p;
bool flag=false;
void dfs(int index,int sum){
if(sum<0) return ;
if(sum==0){
if(index%2==0){
flag=true;
}
return ;
}
dfs(index+1,sum-1);
dfs(index+1,sum-3);
dfs(index+1,sum-7);
dfs(index+1,sum-8);
}
int main(){
cin>>n;
while(n--){
cin>>p;
flag=false;
dfs(0,p);
if(flag)
cout<<"1"<<endl;
else
cout<<"0"<<endl;
}
return 0;
}