酷暑一夏1

不忘初心,方得始终


CodeVS1160 蛇形矩阵 题解

题目

小明玩一个数字游戏,取个n行n列数字矩阵(其中n为不超过100的奇数),数字的填补方法为:在矩阵中心从1开始以逆时针方向绕行,逐圈扩大,直到n行n列填满数字,请输出该n行n列正方形矩阵以及其的对角线数字之和.

题解

蛇形矩阵生成见GIF,从$(n,n)$开始每一圈按照左->上->右->下的顺序走,超过边界或者遇到填过的格子就退回来,然后进入下一圈。
Flash161258.gif
Flash2acf1a.gif

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include<cstdio>
const int MAXN=100+5;
int n,left,x,y,map[MAXN][MAXN];
int main()
{
//printf("flag1");
scanf("%d",&n);
//printf("flag2");
left=n*n;
x=n;y=n;
//printf("INPUT DONE\n");
while(left)
{
//printf("NEW CALL %d %d %d %d\n",y>0,map[x][y],x,y);
while(y>0 && !map[x][y])
{
//printf("[LEFT]");
//printf("%d %d %d\n",left,x,y);
map[x][y]=left;
y--;left--;
}
if(y<=0) y=1; else y++;
x--;
while(x>0 && !map[x][y])
{
//printf("%d %d %d\n",left,x,y);
map[x][y]=left;
x--;left--;
}
if(x<=0) x=1; else x++;
y++;
while(y<=n && !map[x][y])
{
//printf("%d %d %d\n",left,x,y);
map[x][y]=left;
y++;left--;
}
if(y>n) y=n; else y--;
x++;
while(x<=n && !map[x][y])
{
//printf("%d %d %d\n",left,x,y);
map[x][y]=left;
x++;left--;
}
//printf("X=%d\n",x);
if(x>n) x=n; else x--;
y--;
//printf("LEFT=%d x=%d y=%d\n",left,x,y);
//printf("\n");
/*for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
printf("%d\t",map[i][j]);
printf("()\n");
}
printf("\n");*/
// if(left==6) break;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
printf("%d ",map[i][j]);
printf("\n");
}
int ans=0;
for(int i=1;i<=n;i++)
ans+=map[i][i]+map[i][n-i+1];
printf("%d",ans-1);
return 0;
}
最近的文章

Vijos1401 复制CS题解

题目初始时只有1台电脑上装有CS,你有$K$根串口线,只能通过串口线传输数据,一根串口线只能连接两台电脑,每台电脑只有1个串口接口,每次复制需要1小时,且在一定时间段内不得复制,之前的复制也将被中断,求复制完所需的最小时间。 题解题目很简单,对于每段时间(0~第一次视察,每次视察间的空隙,最后一次视 …

于  Vijos 继续阅读
更早的文章

Vijos 1512 SuperBrother打鼹鼠 题解

题目在这个“打鼹鼠”的游戏中,鼹鼠会不时地从洞中钻出来,不过不会从洞口钻进去(鼹鼠真胆大……)。洞口都在一个大小为n(n&lt;=1024)的正方形中。这个正方形在一个平面直角坐标系中,左下角为(0,0),右上角为(n-1,n-1)。洞口所在的位置都是整点,就是横纵坐标都为整数的点。而SuperBr …

于  Vijos 继续阅读