洛谷p5731蛇形矩阵
这道题还蛮有意思的,刚开始想到的写法以我现在的水平感觉还写不出,开个坑,如果以后再碰到,试试我刚开始的想法
后来是借鉴了大佬的思路才AC的,当然我写的还是和大佬不一样,大佬写的简洁很多
还是要多加学习吖
代码如下
#include <stdio.h>
int n;
int a[100];
int main()
{
scanf("%d", &n);
int wide = n;
//第i行第j列
int i = 0;
int j=0;
int fx = 0;//0代表下左,1代表上右
//int start_long = 1;
//int start_wide = 1;
int now=0;//现在在的位置//也就是数组的下标
int k = 0;
while (k < n*n)//现在是第几个数
{
/*
//第一次走最长的长度
while (cishu == 1)
{
a[k] = k + 1;
if ((k + 1) == n) {
cishu == 2;
wide--;
}
k++;
j = k;
}
//第二次开始用两次少两个数
//两个操作:竖着走、横着走
// 判断是竖着向下走还是向上走,横着想左走还是向右走
//里面有数了就转向
不选择这个方式的原因是因为这个最后不确定是向左走还是向右走
//现在在i%n+1列,i/n+1行里(1~n)
*/
//将外面一圈的数组位置里现填上相应的数
//第i行第j列
if (k == 0) {//那些大佬没写这个,直接把初始的写到下面的for循环中了
for (int l = 0; l < 4; l++) {
//执行四次
switch (l) {
case 0:
while (k < n) {
now = i * n + j;
a[now] = k + 1;
k++;
j++;
}
break;
case 1:
while (k < (2 * n - 1)) {
i++;
now = i * n + j - 1;
a[now] = k + 1;
k++;
}
break;
case 2:
while (k < (3 * n - 2)) {
j--;
now = i * n + j - 1;
a[now] = k + 1;
k++;
}
default:
while (k < (4 * n - 4)) {
i--;
now = i * n + j - 1;
a[now] = k + 1;
k++;
}
}
}
}
//后面碰到有数的时候就进行下一个行动轨迹
//往右走
while (a[now+1] == 0) {
j++;
now = i * n + j - 1;
a[now] = k + 1;
k++;
}
//往下走
while (a[now + n] == 0) {
i++;
now = i * n + j - 1;
a[now] = k + 1;
k++;
}
//往左走
while (a[now - 1] == 0) {
j--;
now = i * n + j - 1;
a[now] = k + 1;
k++;
}
//往上走
while (a[now - n] == 0) {
i--;
now = i * n + j - 1;
a[now] = k + 1;
k++;
}
}
for (int u = 0; u < n * n; u++)
{
if (u % n == 0 && u != 0) printf("\n");
printf("%3d", a[u]);//题中要求长度为3d,之前没注意,一直ac不了/(ㄒoㄒ)/~~
}
}
用switch-case是因为余dh大佬出去实习后说公司里基本都用这个,想着练习一下咯