今天打得两场场线上赛了,由于部分题目之前看过,所以写的稍微好点,不过这没什么得意的,毕竟比赛就没这种原题了。这场从19点打到21点20左右,思路还是不怎么明确!特别是那题进制题,明明可以直接处理完再对数组处理,却想复杂了。幸亏最后回头是岸了。
AC1:
标题:九宫幻方
小明最近在教邻居家的小朋友小学奥数,而最近正好讲述到了三阶幻方这个部分,三阶幻方指的是将1~9不重复的填入一个3*3的矩阵当中,使得每一行、每一列和每一条对角线的和都是相同的。
三阶幻方又被称作九宫格,在小学奥数里有一句非常有名的口诀:“二四为肩,六八为足,左三右七,戴九履一,五居其中”,通过这样的一句口诀就能够非常完美的构造出一个九宫格来。
4 9 2
3 5 7
8 1 6
有意思的是,所有的三阶幻方,都可以通过这样一个九宫格进行若干镜像和旋转操作之后得到。现在小明准备将一个三阶幻方(不一定是上图中的那个)中的一些数抹掉,交给邻居家的小朋友来进行还原,并且希望她能够判断出究竟是不是只有一个解。
而你呢,也被小明交付了同样的任务,但是不同的是,你需要写一个程序~
输入格式:
输入仅包含单组测试数据。
每组测试数据为一个3*3的矩阵,其中为0的部分表示被小明抹去的部分。
对于100%的数据,满足给出的矩阵至少能还原出一组可行的三阶幻方。
输出格式:
如果仅能还原出一组可行的三阶幻方,则将其输出,否则输出“Too Many”(不包含引号)。
样例输入
0 7 2
0 5 0
0 3 0
样例输出
6 7 2
1 5 9
8 3 4
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
注意:
main函数需要返回0;
只使用ANSI C/ANSI C++ 标准;
不要调用依赖于编译环境或操作系统的特殊函数。
所有依赖的函数必须明确地在源文件中 #include <xxx>
不能通过工程设置而省略常用头文件。
提交程序时,注意选择所期望的语言类型和编译器类型。
--------------
笨笨有话说:
我最喜欢这类题目了。既然九宫幻方一共也没有多少,我就不辞辛劳地一个一个写出来好了。
也不能太过分,好歹用个数组。
#include<stdio.h>
#include<string.h>
/*
4 9 2
3 5 7
8 1 6
*/
int hf[8][3][3]={
4,9,2,3,5,7,8,1,6,
2,9,4,7,5,3,6,1,8,
8,3,4,1,5,9,6,7,2,
4,3,8,9,5,1,2,7,6,
6,1,8,7,5,3,2,9,4,
8,1,6,3,5,7,4,9,2,
2,7,6,9,5,1,4,3,8,
6,7,2,1,5,9,8,3,4
};
int main()
{
int ex[3][3],i,j,count=0,k,flag=0,answer;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
scanf("%d",&ex[i][j]);
for(i=0;i<8;i++)
{
for(j=flag=0;j<3 && !flag;j++)
for(k=0;k<3;k++)
{
if(ex[j][k]!=0)
{
if(ex[j][k]!=hf[i][j][k])
{
flag=1;
break;
}
}
}
if(!flag)
{
count++;
answer=i;
}
}
if(count==1)
{
for(i=0;i<3;i++)
{
printf("%d",hf[answer][i][0]);
for(j=1;j<3;j++)
printf(" %d",hf[answer][i][j]);
printf("\n");
}
}
else
printf("Too Many\n");
return 0;
}
AC2: 标题: Excel地址
Excel单元格的地址表示很有趣,它使用字母来表示列号。
比如,
A表示第1列,
B表示第2列,
Z表示第26列,
AA表示第27列,
AB表示第28列,
BA表示第53列,
....
当然Excel的最大列号是有限度的,所以转换起来不难。
如果我们想把这种表示法一般化,可以把很大的数字转换为很长的字母序列呢?
本题目既是要求对输入的数字, 输出其对应的Excel地址表示方式。
例如,
输入:
26
则程序应该输出:
Z
再例如,
输入:
2054
则程序应该输出:
BZZ
我们约定,输入的整数范围[1,2147483647]
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
注意:
main函数需要返回0;
只使用ANSI C/ANSI C++ 标准;
不要调用依赖于编译环境或操作系统的特殊函数。
所有依赖的函数必须明确地在源文件中 #include <xxx>
不能通过工程设置而省略常用头文件。
提交程序时,注意选择所期望的语言类型和编译器类型。
------------------------------
笨笨有话说:
这有点像进制关系,又不完全是。好像末2位是以1当26,末3位是以1当26*26
歪歪有话说:
要是从字母序列转数字还好点,倒过来有点麻烦,不过计算机跑得快啊。
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<queue>
using namespace std;
typedef long long ll;
int main()
{
ll data,i,mod[7],len=0;
int kz[20]={0};
for(mod[0]=1,i=1;i<7;i++)
mod[i]=mod[i-1]*26;
cin>>data;
while(data)
{
kz[len++]=data%26;
data/=26;
}
for(i=0;i<len;i++)
{
if(kz[i]<=0)
{
kz[i+1]--;
kz[i]+=26;
}
}
if(kz[len]<0) len--;
for(i=len-1;i>=0;i--)
printf("%c",kz[i]-1+'A');
printf("\n");
return 0;
}
AC3:
标题:字母组串
由 A,B,C 这3个字母就可以组成许多串。
比如:"A","AB","ABC","ABA","AACBB" ....
现在,小明正在思考一个问题:
如果每个字母的个数有限定,能组成多少个已知长度的串呢?
他请好朋友来帮忙,很快得到了代码,
解决方案超级简单,然而最重要的部分却语焉不详。
请仔细分析源码,填写划线部分缺少的内容。
#include <stdio.h>
// a个A,b个B,c个C 字母,能组成多少个不同的长度为n的串。
int f(int a, int b, int c, int n)
{
if(a<0 || b<0 || c<0) return 0;
if(n==0) return 1;
return ______________________________________ ; // 填空
}
int main()
{
printf("%d\n", f(1,1,1,2));
printf("%d\n", f(1,2,3,3));
return 0;
}
对于上面的测试数据,小明口算的结果应该是:
6
19
注意:只填写划线部分缺少的代码,不要提交任何多余内容或说明性文字。
f(a-1,b,c,n-1)+f(a,b-1,c,n-1)+f(a,b,c-1,n-1)
计蒜客上的那场虽然混了个90名,不过发现还是菜,几乎没A几题,感觉思路还可以的全错了.