第一节,坑爹的奥数
xxx+xxx=xxx?
将数字1--9分别填入9个x中,每个数字只能使用一次使得等式成立
请问,有多少种合理的组合?
注:173+286=459&&286+173=459 为同一种组合
思路
可用第一章中的桶排序那里,用标记法来实现一个数组互不相等的问题
#include<iostream>
using namespace std;
int book[100],a[20],t;
int main()
{
for(a[1]=1;a[1]<=9;a[1]++)
for(a[2]=1;a[2]<=9;a[2]++)
for(a[3]=1;a[3]<=9;a[3]++)
for(a[4]=1;a[4]<=9;a[4]++)
for(a[5]=1;a[5]<=9;a[5]++)
for(a[6]=1;a[6]<=9;a[6]++)
for(a[7]=1;a[7]<=9;a[7]++)
for(a[8]=1;a[8]<=9;a[8]++)
for(a[9]=1;a[9]<=9;a[9]++)
{
for(int i=1;i<=9;i++)book[i]=0;
for(int i=1;i<=9;i++)book[a[i]]=1;
int s=0;
for(int i=1;i<=9;i++)s=s+book[i];
if(s=9&&a[1]*100+a[2]*10+a[3]+a[4]*100+a[5]*10+a[6]==a[7]*100+a[8]*10+a[9])
t++;
}
cout<<t/2<<endl;
return 0;
}
这个也是按照书上写的,不过可能相关的数太多了,都运行不完,不过这个本身也很暴力
第二节,炸弹人
#include<iostream>
using namespace std;
int main()
{
char a[60][60];
int i,j,sum,map=0,p,q,x,y,n,m;
cin>>n>>m;//n表示行数,m表示列数
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(a[i][j]=='.')
{
sum=0;
x=i,y=j;
while(a[x][y]!='#')
{
if(a[x][y]=='G')
sum++;
x--;
}
x=i,y=j;
while(a[x][y]!='#')
{
if(a[x][y]=='G')
sum++;
y--;
}
x=i,y=j;
while(a[x][y]!='#')
{
if(a[x][y]=='G')
sum++;
x++;
}
x=i,y=j;
while(a[x][y]!='#')
{
if(a[x][y]=='G')
sum++;
y++;
}
if(sum>map)
{
map=sum;
p=i;
q=j;
}
}
}
cout<<map<<endl;
return 0;
}
第三节,火柴人等式
#include<iostream>
using namespace std;
int fun(int x)
{
int num=0,f[10]={6,2,5,5,4,5,6,3,7,6};//num计算火柴总数,f[]存下0-9对应的火柴数量
while(x/10!=0)
{
num+=f[x%10];
x=x/10;
}
num=num+f[x];
return num;
}
int main()
{
int m,a,b,c,s=0;
cin>>m;//输入火柴个数
for(a=0;a<=1111;a++)
for(b=0;b<=11111;b++)
{
c=a+b;
if(fun(a)+fun(b)+fun(c)==m-4)
{
printf("%d+%d=%d\n",a,b,c);
s++;
}
}
cout<<s<<endl;
return 0;
}
第四节,数的全排列
emmm……
说实话……我还不会……
明天应该会再尝试一下!