| 题号 | 标题 | 分数 |
|---|---|---|
| A | 金币 | 100 |
| B | 扫雷 | 100 |
| C | 神奇的幻方 | 100 |
| D | 火柴棒等式 | 20 |
A.金币
> 解题思路
水题不讲。
B.扫雷
> 解题思路
这一道题我只是十分暴力地把上下左右左上左下右上右下都判断然后加了一下。
> 代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a,n,m; char s[101][101];
int main()
{
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) cin>>s[i][j];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
a=0;
if(s[i][j]=='?')
{
for(int k=i-1;k<=i+1;k++)
for(int t=j-1;t<=j+1;t++)
if(s[k][t]=='*') a++;
//判断是否有地雷
printf("%d",a);
}
else printf("*");
}
printf("\n");
}
return 0;
}
C.神奇的幻方
> 解题思路
直接按照题目描述那样来做,很简单。就是一开始做到9就会炸,然后调了好久,后来才发现没有清0。。。
> 代码
#include<iostream>
#include<cstdio>
using namespace std;
int x,y;
void ooo(int x1,int y1)
{
x=x1; y=y1;
}//这里调用ooo函数是因为我不喜欢用太多大括号,很乱。
//强迫症患者了解一下。。。
int main()
{
int a[40][40]={0},n;
scanf("%d",&n);
x=1; y=n/2+1; a[x][y]=1;
for(int i=2;i<=n*n;i++)
{
if(x==1&&y!=n) ooo(n,y+1);
else if(x!=1&&y==n) ooo(x-1,1);
else if(x==1&&y==n) ooo(x+1,y);
else if(a[x-1][y+1]==0) ooo(x-1,y+1);
else ooo(x+1,y);
a[x][y]=i;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
printf("%d ",a[i][j]);
printf("\n");
}
return 0;
}
D.火柴棒等式
> Description
给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A、B、C是用火柴棍拼出的整数(若该数非零,则最高位不能是0)。用火柴棍拼数字0-9的拼法如图所示:
注意:
- 加号与等号各自需要两根火柴棍
- 如果A≠B,则A+B=C与B+A=C视为不同的等式(A、B、C>=0)
- n根火柴棍必须全部用上
> Input
输入文件matches.in共一行,又一个整数n(n<=24)。
> Output
输出文件matches.out共一行,表示能拼成的不同等式的数目。
> Sample Input
【输入样例1】
14
【输入样例2】
18
> Sample Output
【输入样例1】
2
//2个等式为0+1=1和1+0=1。
【输出样例2】
9
//9个等式为:
0+4=4 0+11=11 1+10=11 2+2=4 2+7=9
4+0=4 7+2=9 10+1=11 11+0=11
> 解题思路
本来是一道很简单的题,循环一下。当时看到又懵了,就直接打了一个样例,然后还拿了20分。改的时候本来用记忆化搜索,但是不知道为什么交上去会错,就只好改回原来的。
> 代码
#include<cstdio>
const int s[10]={6,2,5,5,4,5,6,3,7,6};
int ooo(int t)
{
if(t<10) return s[t];
int l=0;
while(t>0)
{
l+=s[t%10];
t/=10;
}
return l;
}
int main()
{
int ans=0,n;
scanf("%d",&n); n-=4;//减去加号和减号的火柴棒
for(int i=0;i<=1001;i++)
for(int j=i;j<=1001;j++)
if(ooo(i)+ooo(j)+ooo(i+j)==n)
{
ans++;
if(i!=j) ans++;
//两个不相同的加数加在一起有两个算法
}
printf("%d",ans);
}