foodszhu
编程之美2013全国挑战赛------资格赛-----题解??
展开Biu

本帖最后由 foodszhu 于 2013-4-9 01:36 编辑

好吧。。。重开一贴有水贴的嫌疑。。。不过作为赛后的发布一下题解还是很有必要的。。。。

但是个人来说。。。虽然小数据都水过了。。。。但无情的大数据只过了第一题orz。。。。。#10t

排名排到400+ 。@Whisper1166 ( W君看了一下跟我一样。。。第一题过了。。第二题WA第三题RE,排名靠的相当近。。。。)

所以在这里也不敢说发什么解题报告。。。毕竟自己还没有做出来。。。但是为了照顾一下刚接触编程的同学。。。。咱们就把问题简单化吧。。。。

这里也非常欢迎大家把自己的AC代码贴出来,尤其是过了大数据的代码。。。如果有空还可以讲解一下最好。。。W君不要吝啬糖哦。。。

题目链接:https://www.gn00.com/t-268811-1-1.html 我也就不再打题目了。。。

---------------------------------------------------------------------------------------------------------------------------------------------

第一题 : 传话游戏

[mw_shl_code=c,true]#include <stdio.h>

#include <stdlib.h>

#include <string.h>

int main(){

int T;

scanf("%d", &T);

int A = T;

while(T > 0){

T--;

int N,M;

scanf("%d%d", &N, &M);

char change[100][2][100] = {{{0}}};

for(int i = 0; i < M; i++){

scanf("%s%s", change[0], change[1]);

}

char think[100] = {0}, pass[100][100] = {{0}};

scanf("\n%[^\n]", think);

int l1 = 0, l2 = 0;

for(int i = 0; i < strlen(think); i++){

if(think != ' '){

pass[l1][l2++] = think;

} else {

l1++;

l2 = 0;

}

}

l1++;

for(int i = 0; i < N - 1; i++){

for(int k = 0; k < l1; k++){

int t = 0;

for(int j = 0; j < M; j++){

if(t == 0 && strcmp(pass[k], change[j][0]) == 0){

strcpy(pass[k], change[j][1]);

t = 1;

}

}

}

}

printf("Case #%d:", A - T);

for(int i = 0; i < l1; i++){

printf(" %s", pass);

}

printf("\n");

}

}[/mw_shl_code]

代码虽然是C风格。。。但是只能交C++,因为大赛编译器不支持c99.。。orz。。。。

三道之中最水一题。。。考究会不会读取字串并分割。。。然后就是替换字串的问题。。。

读取一行含空格的字符串时得用gets或者scanf("\n%[^\n]"),gets前必须加getchar否则不会读入也会导致错误。。。

剩下似乎没什么了。。。注意下一个单词不能在一个人那里来回变(就是要break出来。。。),还有n个游戏者,但是只变n-1次就好了。。。数组稍微开大点。。。就可以过大数据了。。。。

-------------------------------------------------------------------------------------------------------------------------------------------------------

第二题:长方形

[mw_shl_code=applescript,true]#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <math.h>

int main(){

int T;

scanf("%d", &T);

for(int t = 0; t < T; t++){

int N,M,K;

scanf("%d%d%d", &N, &M, &K);

if(N > M){

int tmp = N;

N = M;

M = tmp;

}

int maxN = 0;

for(int min = 1, max = 0; min <= N; min++){

max = K / min;

if(max > M){

max = M;

}

int remain = K - min * max, num = min * max * (min - 1) * (max - 1) / 4;

remain -= remain / min * min;

if(remain > 1){

if(max < M){

num += max * (remain - 1) * remain / 2;

} else if(min < N){

num += min * (remain - 1) * remain / 2;

}

}

if(num > maxN){

maxN = num;

}

}

printf("Case #%d: %d\n", t + 1, maxN);

}

}[/mw_shl_code]

好吧。。。。这题我是暴力穷举过得。。。。有种淡淡的无奈啊。。。结果看起来穷举都是错的。。。最后大数据WA了。。。不清楚为什么。。。

用了一个简单的公式。。。一个N*M的网格中最多有N*M*(N-1)(M-1) / 4个长方形(证明也很简单,就是乘法原理,横着的边数 * 纵列的边数 = (1 + 2 + 3+.....N) * (1 + 2 + 3......M))

剩下的石子数目肯定少于min(N, M),然后在一个个的铺到较长的那个边上。。。再计算。。。把可能的大矩阵遍历一遍。。。就可以得到最大值了。。。

至于大数据哪里错了还真不知道。。。可能这样子做出来并不一定是最优的也有可能。。。。希望有过大数据的出来讲一下。。。

--------------------------------------------------------------------------------------------------------------------------------------------------------

第三题:树上的三角形

[mw_shl_code=c,true]#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <math.h>

int map[200][200] = {{0}}, path[200][200] = {{0}}, dist[200][200] = {{0}}, N = 0;

int floyd(){

for(int i = 0; i < N; i++){

for(int j = 0; j < N; j++){

dist[j] = map[j];

if(map[j] > 10000){

path[j] = -1;

} else {

path[j] = i;

}

}

}

for(int k = 0; k < N; k++){

for(int i = 0; i < N; i++){

for(int j = 0; j < N; j++){

if(dist[k] + dist[k][j] < dist[j]){

dist[j] = dist[k] + dist[k][j];

path[j] = path[k][j];

}

}

}

}

}

int main(){

int T;

scanf("%d", &T);

for(int t = 0; t < T; t++){

scanf("%d", &N);

for(int i = 0; i < 200; i++){

for(int j = 0; j < 200; j++){

map[j] = 20000001;

}

}

memset(dist, 0, sizeof(dist));

memset(path, 0, sizeof(path));

for(int i = 0; i < N - 1; i++){

int a, b, len = 0;

scanf("%d%d%d", &a, &b, &len);

map[a - 1][b - 1] = len;

map[b - 1][a - 1] = len;

}

floyd();

printf("Case #%d:\n", t + 1);

int M = 0;

scanf("%d", &M);

for(int i = 0; i < M; i++){

int S, F, len[1000] = {0}, l = 0;

scanf("%d%d", &S, &F);

S--, F-- ;

if(S == F || path[S][F] == -1){

printf("No\n");

continue;

}

while(S != F){

int end = F;

F = path[S][F];

len[l++] = map[F][end];

}

for(int x = 0; x < l; x++){

for(int y = x + 1; y < l; y++){

if(len[x] > len[y]){

int asd = len[x];

len[x] = len[y];

len[y] = asd;

}

}

}

int result = 0;

for(int k = 1; k < l - 1; k++){

if(len[k - 1] + len[k] > len[k + 1]){

result = 1;

break;

}

}

if(result == 0){

printf("No\n");

} else {

printf("Yes\n");

}

}

}

}[/mw_shl_code]

也是某些意义上的暴力过。。。用floyd先求出最短路径,再将最短路径上的树枝长度排序,再判断是否构成三角形。。。。

大数据错的也很明显。。。我数组就开了那么大。。。。肯定RE。。。。

-------------------------------------------------------------------------------------------------------------------------------------

经过这次资格赛发现微软还是很细腻的做了很多工作。。。作为资格赛,题目难度相当于学过C语言课就差不多能过第一题,

一个认真听过算法课的计算机学生就可以答完所有小数据,搞过ACM的应该就可以水过大数据的的样子。。。。

作为一名正在学算法课的学生表示压力山大。。。估计到初赛就一道题都答不上了。。。或许向班里大神要要代码不错。。。。

@Whisper1166 不过初赛可能看样子在版里搞不起来了吧。。。毕竟有时间限制两个小时还是很紧张。。。讨论做不起来的话难道初赛完直接在网上找找题解?。。。。

[查看全文]
weeken2013
错错错~来改错【第二集】
展开Biu

#include<stdio.h>

#include<stdlib.h>

#include"point.h"

#include<stdbool.h>

struct TreereeNode{

int dim,index;

bool left,right;

}tree[MAXN];

int sortDimension;

bool compare(int x,int y){

return point[x].p[sortDimension]<point[y].p[sortDimension];

}

它说我compare有错~不是说用<stdbool.h>这个头文件后可以用bool型么

[查看全文]
weeken2013
怎么在C中实现set集合
展开Biu

我要把C++的代码移植到C上实现!!要在C语言中实现set集合

前边我定义了这么一个结构体

struct Point{

int p[maxk];

}

后边我要用到set集合的操作

set *本站禁止HTML标签噢* ans

insert()

size()

earse()

clear()

rbegin()

大概有这些操作~

求破之~~!!!!!!!!!大神有请~

[查看全文]
foodszhu
关于破解图片验证码的做法
展开Biu

就在前晚(4月7日凌晨)这个不幸的时刻。。。度娘抽了。。。姬宅登陆要验证码了。。。

由于个人原因 自动签到 导致昨天的贴吧和姬宅全部签到失败。。。贴吧的更惨。。。连续200多天被断。。。由于一天不能签到超过100个吧而无法补救。。。。=1115=

然后查原因。。。度娘是抽了。。。姬宅反复查都没问题。。签到的插件也没改变。。。结果在上小号的时候才发现。。姬宅要验证码了。。。吐血。。。自动登陆自然也不行了。。。#5t

应该是为了解决传说中恶意广告的情况吧。。。出发意图也是好的。。。但是结果却导致了程序失败。。。不过也没什么。。以后手动签就是了。。。

不过由此我们可以讨论一下这个图片验证如何去破解(这个不违法吧)

其实有段时间也简单的弄过一点图片验证码,大概就是取2值化再降噪,人工选取图片做成样本库。。。再利用程序反复验证生成更大的特征,跟Adaboost Adaboost类似(仔细一想不就是特征识别么,,,不过没搞人脸识别之前还真不知道这些22333)

这种做法还算比较靠谱的。。如果样本找的比较全也是可以做出很好的结果的。。不过如果字符旋转大。。。扭曲程度高。。。尤其是类似于google验证码这种连人类自己都认不出来的验证码实在无能为力。。。

话说大家还有知道什么比较好的方法么?可以讨论讨论。。。好一点的甚至可以尝试实现一下也不错哦!

[查看全文]
foodszhu
编程之美2013全国挑战赛------资格赛
展开Biu

本帖最后由 foodszhu 于 2013-4-7 12:16 编辑

转自http://programming2013.cstnet.cn/qualification/

依旧是3道题。。。过一道题的小数据就可以参加初赛。。。不过看样子吾辈虽然能过资格赛。。但是估计到初赛就一道题都做不出来了。。召唤做题@Mr_Alex @Whisper1166 @langyxxl @汝欠咱的一生

--------------------------------------------------------------------------------------------------------------------------------------------------------------

题目 1传话游戏

时间限制: 1000ms 内存限制: 256MB

描述

Alice和Bob还有其他几位好朋友在一起玩传话游戏。这个游戏是这样进行的:首先,所有游戏者按顺序站成一排,Alice站第一位,Bob站最后一位。然后,Alice想一句话悄悄告诉第二位游戏者,第二位游戏者又悄悄地告诉第三位,第三位又告诉第四位……以此类推,直到倒数第二位告诉Bob。两位游戏者在传话中,不能让其他人听到,也不能使用肢体动作来解释。最后,Bob把他所听到的话告诉大家,Alice也把她原本所想的话告诉大家。

由于传话过程中可能出现一些偏差,游戏者越多,Bob最后听到的话就与Alice所想的越不同。Bob听到的话往往会变成一些很搞笑的东西,所以大家玩得乐此不疲。经过几轮游戏后,Alice注意到在两人传话中,有些词汇往往会错误地变成其他特定的词汇。Alice已经收集到了这样的一个词汇转化的列表,她想知道她的话传到Bob时会变成什么样子,请你写个程序来帮助她。

输入

输入包括多组数据。第一行是整数 T,表示有多少组测试数据。每组数据第一行包括两个整数 N 和 M,分别表示游戏者的数量和单词转化列表长度。随后有 M 行,每行包含两个用空格隔开的单词 a 和 b,表示单词 a 在传话中一定会变成 b。输入数据保证没有重复的 a。最后一行包含若干个用单个空格隔开的单词,表示Alice所想的句子,句子总长不超过100个字符。所有单词都只包含小写字母,并且长度不超过20,同一个单词的不同时态被认为是不同的单词。你可以假定不在列表中的单词永远不会变化。

输出

对于每组测试数据,单独输出一行“Case #c: s”。其中,c 为测试数据编号,s 为Bob所听到的句子。s 的格式与输入数据中Alice所想的句子格式相同。

数据范围

1 ≤ T ≤ 100

小数据:2 ≤ N ≤ 10, 0 ≤ M ≤ 10

大数据:2 ≤ N ≤ 100, 0 ≤ M ≤ 100

样例输入24 3

ship sheep

sinking thinking

thinking sinking

the ship is sinking

10 5

tidy tiny

tiger liar

tired tire

tire bear

liar bear

a tidy tiger is tired

样例输出

Case #1: the sheep is thinking

Case #2: a tiny bear is bear

本人目前唯一做出来的题。。。较水。。。属于只要学过C基本都能做型。。。。大数据给的数据规模也不大。。。称得上是保送的题

题目 2 长方形

时间限制: 1000ms 内存限制: 256MB

描述

在 N × M 的网格上,放 K 枚石子,每个石子都只能放在网格的交叉点上。问在最优的摆放方式下,最多能找到多少四边平行于坐标轴的长方形,它的四个角上都恰好放着一枚石子。

输入

输入文件包含多组测试数据。

第一行,给出一个整数T,为数据组数。接下来依次给出每组测试数据。

每组数据为三个用空格隔开的整数 N,M,K。

输出

对于每组测试数据,输出一行"Case #X: Y",其中X表示测试数据编号,Y表示最多能找到的符合条件的长方形数量。所有数据按读入顺序从1开始编号。

数据范围

1 ≤ T ≤ 100

0 ≤ K ≤ N * M

小数据:0 < N, M ≤ 30

大数据:0 < N, M ≤ 30000

样例输入

3

3 3 8

4 5 13

7 14 86

样例输出

Case #1: 5

Case #2: 18

Case #3: 1398

有点眉目的题。。。不过有限制需要仔细想想。。。

[fold=小提示]对于一个N x M 的方格,其中长方形的数量是NM(N-1)(M-1)/4个[/fold]

恩,这题也算水过了。。。暴力穷举。。。

题目 3 树上的三角形

时间限制: 2000ms 内存限制: 256MB

描述

有一棵树,树上有只毛毛虫。它在这棵树上生活了很久,对它的构造了如指掌。所以它在树上从来都是走最短路,不会绕路。它还还特别喜欢三角形,所以当它在树上爬来爬去的时候总会在想,如果把刚才爬过的那几根树枝/树干锯下来,能不能从中选三根出来拼成一个三角形呢?

输入

输入数据的第一行包含一个整数 T,表示数据组数。

接下来有 T 组数据,每组数据中:

第一行包含一个整数 N,表示树上节点的个数(从 1 到 N 标号)。

接下来的 N-1 行包含三个整数 a, b, len,表示有一根长度为 len 的树枝/树干在节点 a 和节点 b 之间。

接下来一行包含一个整数 M,表示询问数。

接下来M行每行两个整数 S, T,表示毛毛虫从 S 爬行到了 T,询问这段路程中的树枝/树干是否能拼成三角形。

输出

对于每组数据,先输出一行"Case #X:",其中X为数据组数编号,从 1 开始。

接下来对于每个询问输出一行,包含"Yes"或“No”,表示是否可以拼成三角形。

数据范围

1 ≤ T ≤ 5

小数据:1 ≤ N ≤ 100, 1 ≤ M ≤ 100, 1 ≤ len ≤ 10000

大数据:1 ≤ N ≤ 100000, 1 ≤ M ≤ 100000, 1 ≤ len ≤ 1000000000

样例输入

2

5

1 2 5

1 3 20

2 4 30

4 5 15

2

3 4

3 5

5

1 4 32

2 3 100

3 5 45

4 5 60

21 41 3

样例输出

Case #1:No

Yes

Case #2:No

Yes

怎么说呢,这种题看着就不想做的样子。。。。

小数据的话。。看起来最短路+模拟应该就能解决。。。大数据。。。。不想说话

实验证明的确是这样。。。先最短路保存路径,然后排序路径长度,每相邻3个不能组成的话就不行

RF原来是不能用qsort。。。。枉我改了一晚上。。。。愣是不知道错哪。。。。最后一个冒泡解决了。。。。

---------------------------------------------------------------------------------------------------------------------------------------

恩。。大家可以在这里好好讨论一下哦。。。。如果还是高校在校生的可以自己注册一个号来玩,如果不是的可以贴代码。。。我去交。。。。当然讨论为主。。。。

[查看全文]
moshihao
常见简单排序查找方法
展开Biu

本帖最后由 moshihao 于 2013-4-5 17:33 编辑

常见简单的排序查找方法汇总:

1.哨兵法查找

将数组或链表的第一位元素初始化留空,放置key元素。哨兵也成为监视哨,目的是在于避免每一步都有其余检测每个表是否都已经检查完毕。这仅仅是一个在程序设计的技巧上的改进。然而实践证明,在顺序查询长度大于1000时,进行一次查询所需时间节省近一般时间(取自数据结构-吴伟民版数据)。

[mw_shl_code=c,true]/*用监视哨查找

查询返回目标元素位置,找不到则返回0

*/

int search(int array[],int n,int k)

{int i;

i=n-1;

array[0]=k;

while(array!=k) i--;

return(i);

}[/mw_shl_code]

2.冒泡排序

冒泡排序,可以说是笔者在程序设计的学习历程中第一次接触的有名字的算法了。从起始元素,逐个比较,交换,以达到按照一定规律的顺序存储的目的。

[mw_shl_code=c,true]/*冒泡排序法*/

void mpsort(int array[])

{int i,j,a;

a=0;

for(i=1;i for(j=i+1;j<N;j++)

if(array>array[j])

{a=array;

array=array[j];

array[j]=a;}

}[/mw_shl_code]

3.折半查找(二分法)

折半查找,也常称为二分法。将元素集合分成上下高低两部分,比较中间值与所查找值,大于则在上部查找,小于则在下部查找。大幅度提高效率,但源数据集合须为有序集合。

[mw_shl_code=c,true]/*折半查找法*/

int halfsearch(int array[],int n,int k)

{int i,j,mid;

i=1;j=n;

while(i< =j)

{mid=(i+j)/2;

if(k==array[mid]) return(mid);

else if(k<array[mid]) j=mid-1;

else i=mid+1;

}

return(0);

}[/mw_shl_code]

4.插入排序

直接插入时比较排序移动,没啥好说的。。。

[mw_shl_code=c,true]/*直接插入排序*/

void insertsort(int array[])

{int i,j;

for(i=2;i {array[0]=array;

j=i-1;

while(array[0]<array[j])

{array[j+1]=array[j--];

array[j+1]=array[0];

}

}[/mw_shl_code]

测试代码:

[mw_shl_code=c,true]#include <stdio.h>

#include <math.h>

#define N 11

/*用监视哨查找*/

int search(int array[],int n,int k)

{int i;

i=n-1;

array[0]=k;

while(array!=k) i--;

return(i);

}

/*折半查找法*/

int halfsearch(int array[],int n,int k)

{int i,j,mid;

i=1;j=n;

while(i< =j)

{mid=(i+j)/2;

if(k==array[mid]) return(mid);

else if(k<array[mid]) j=mid-1;

else i=mid+1;

}

return(0);

}

/*冒泡排序法*/

void mpsort(int array[])

{int i,j,a;

a=0;

for(i=1;i<N;i++)

for(j=i+1;j<N;j++)

if(array>array[j])

{a=array;

array=array[j];

array[j]=a;}

}

/*直接插入排序*/

void insertsort(int array[])

{int i,j;

for(i=2;i {array[0]=array;

j=i-1;

while(array[0]<array[j])

{array[j+1]=array[j--];

array[j+1]=array[0];

}

}

}

/*建立*/

void creat(int array[])

{int i;

printf("enter the array:\n");

for(i=1;i<N;i++)

scanf("%d",&array);

}

/*显示*/

void print(int array[])

{int i;

printf("The numbers after sort is:\n");

for(i=1;i<N;i++)

printf("%d ",array);

printf("\n");

}

main()

{int a[11],i,x,chang;

/*printf("enter the array\n");

for(i=1;i<11;i++)

scanf("%d",&a);*/

aga:

printf("\nchang:1: use watching method finding\n 2:use half method finding\n 3: use directness intsert method sort\n 4:use bubble up method sort\n 5:exit\n");

scanf("%d",&chang);

switch (chang)

{case 1:

{creat(a);

printf("Please int the search number:\n");

scanf("%d",&x);

printf("The number station is:%d\n",search(a,N,x));

goto aga;

}

case 2:

{ creat(a);

insertsort(a);

print(a);

printf("Please int the search number:\n");

scanf("%d",&x);

printf("The number station is:%d\n",halfsearch(a,N,x));

goto aga;

}

case 3:

{creat(a);

insertsort(a);

print(a);

goto aga;

}

case 4:

{creat(a);

mpsort(a);

print(a);

goto aga;

}

case 5:{ printf("exit!\n");break;}

default:{printf("Error!\n"); goto aga;}

}

}[/mw_shl_code]

[查看全文]
_Nozomi
【每周一题】素数判定
展开Biu

我找的都是嗯…比较基础的题嘛,所以各位都快来试一试,这次做对了或者说出自己想法的有奖~!

so,先来上问题:

Problem Description

对于表达式n^2+n+41,当n在(x,y)范围内取整数值时(包括x,y)(-39<=x<y<=50),判定该表达式的值是否都为素数。

Input

输入数据有多组,每组占一行,由两个整数x,y组成,当x=0,y=0时,表示输入结束,该行不做处理。

Output

对于每个给定范围内的取值,如果表达式的值都为素数,则输出"OK",否则请输出“Sorry”,每组输出占一行。

Sample Input

0 1

0 0

Sample Output

OK


用传统的素数判定一步一步来当然是可以的,但是窝们讲究的是用最小的Code.Len,最短的Exe.Time来解决问题~

@foodszhu @狂奔的瘦子 @兰陵笑忘生 @moxiagy @Mr_Alex @汝欠咱的一生 @terry182 快来讨论讨论方法吧~

稍后会在2楼更新

该贴已经同步到 Whisper1166的微博

[查看全文]
foodszhu
2013编程之美全国挑战赛 ----- 测试赛
展开Biu

本帖最后由 foodszhu 于 2013-4-4 18:43 编辑

来自http://programming2013.cstnet.cn/warmup

测试赛。。。菜鸟级。。。。各位初学者可以尝试。。。大家也可以讨论一下不同的方法和各种各样的思路。。。如果有问题。。这种题感觉吾辈还是可以100%解答的。。。实在解答不了的就@Mr_Alex @Whisper1166

题目分为小数据和大数据,但是测评时只考虑小数据。。。(亏我A+B还写了个高精度出来)

第一题 A+B

时间限制: 1000ms 内存限制: 1024MB

描述输入两个正整数A和B, 求A+B的值

输入两个正整数A, B

输出A+B的和

对于小数据, 0 < A, B <= 10; 对于大数据, 0 < A, B <= 10^100

不想说了。。。万年第一题。。。有兴趣的同学请写高精度

第二题 石头剪刀布

时间限制: 1000ms 内存限制: 1024MB

描述石头剪刀布是常见的猜拳游戏。石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,则不分胜负。

一天,小A和小B正好在玩石头剪刀布。已知他们的出拳都是有规律的,比如:“石头-布-石头-剪刀-石头-布-石头-剪刀……”,就是以“石头-布-石头-剪刀”为周期的。请问,小A和小B比了N轮之后,谁赢了?

输入输入的第一行包含一个整数K,表示K组测试数据。

之后的每组测试数据包含三行。第一行包含三个整数:N,NA,NB,分别表示比了N轮,小A出拳的周期长度,小B出拳的周期长度。第二行包含NA个整数,表示小A出拳的规律,第三行包含NB个整数,表示小B出拳的规律。其中,0表示“石头”,2表示“剪刀”,5表示“布”。

对于小数据,0 < K,N,NA,NB <= 10;对于大数据,0 < K,N,NA,NB <= 100;

输出对于每组测试数据,输出一行。如果小A赢了,输出A;如果小B赢了,输出B;如果两人打平,输出draw。

提示对于第一组测试数据,猜拳过程为:

A:0 2 5 0 2 5 0 2 5 0

B:0 5 0 2 0 5 0 2 0 5

所以A赢了4轮,B赢了2轮,双方打平4轮,所以A赢了。

对于第二组测试数据,猜拳过程为:

A:2 0 5 2 0

B:0 2 5 0 2

所以A赢了2轮,B赢了2轮,双方打平1轮,所以最终打平了。

样例输入

2

10 3 4

0 2 5

0 5 0 2

5 3 3

2 0 5

0 2 5

样例输出

Ad

raw

模拟题。。。很基础。。。至于给的大数据也没觉得大到哪里去。。。。

不过应该也是有其他做法的希望能多多讨论!

踩方格

时间限制: 1000ms 内存限制: 1024MB

描述有一个方格矩阵,矩阵边界在无穷远处。我们做如下假设:

a. 每走一步时,只能从当前方格移动一格,走到某个相邻的方格上;

b. 走过的格子立即塌陷无法再走第二次;

c. 只能向北、东、西三个方向走;

请问:如果允许在方格矩阵上走n步,共有多少种不同的方案。2种走法只要有一步不一样,即被认为是不同的方案。

输入允许在方格上行走的步数n

输出计算出的方案数量

对于小数据1 <= n <= 20; 对于大数据1 <= n <= 100.

样例输入

2

样例输出

7

这题大家就好好讨论吧。。。能否直接推出数学表达式?

[查看全文]