P5731 【深基5.习6】蛇形方阵
这两个题目是一个性质的
题目比较简单,整体思路模拟下来可以正常AC
具体来说就是:
①定义URLD(魔方转动字母表示)定义一下当前矩阵的范围
②从第一格开始模拟,通过二维数组当前位置和URLD范围作对比,判断如果到达转角点则转弯
③基于这个例子,如果数字到达12的时候,如果继续判断会把1给覆盖,所以必须要在这个位置的时候停下来
④停下来之后将URLD四个范围减小一格,这样就进入下一个范围循环,只要继承i的数据就可以AC了
这题有两个坑:
①输出必须占用且仅占用三个字符,所以要用setw(2)控一下
②还有一个坑就是每一行都要输出一空格个“ ”,所以要注意一下。
#include <bits/stdc++.h>
using namespace std;
int arr[1001][1001];
int main()
{
int n;
cin >> n;
int na = 1;
int nb = 1;
int U = 1;
int L = 1;
int R = n;
int D = n;
int fin = 0;
for(int i = 1 ; i <= n*n ; i++)
{
if(na == U && nb == L)
{
if(fin == 1)
{
fin == 0;
na++;
nb++;
U++;
D--;
R--;
L++;
}
arr[na][nb] = i;
nb++;
continue;
}
if(na == U && nb != R && nb != L)
{
arr[na][nb] = i;
nb++;
continue;
}
if(na == U && nb == R)
{
arr[na][nb] = i;
na++;
continue;
}
if(na != U && na != D && nb == R)
{
arr[na][nb] = i;
na++;
continue;
}
if(na == D && nb == R)
{
arr[na][nb] = i;
nb--;
continue;
}
if(na == D && nb != R && nb != L)
{
arr[na][nb] = i;
nb--;
continue;
}
if(na == D && nb == L)
{
arr[na][nb] = i;
na--;
continue;
}
if(na != D && na != U && nb == L)
{
arr[na][nb] = i;
na--;
fin = 1;
continue;
}
}
for(int i = 1 ; i <= n ; i++)
{
cout << " ";
for(int j = 1 ; j <= n ; j++)
{
cout << setw(2) << arr[i][j] << " ";
}
cout << endl;
}
return 0;
}