蛇形、之字、回字打印 您所在的位置:网站首页 蛇形输出矩阵是什么 蛇形、之字、回字打印

蛇形、之字、回字打印

2023-12-16 06:31| 来源: 网络整理| 查看: 265

打印 Z字型扫描(有的又叫这是蛇形扫描)方法一:处在同一对角线(东北指向)上的点 之 行坐标+纵坐标 的和相等,且就是对角线序号方法二:利用东北指向的对角线上的点 横纵坐标之和相等,可以把横纵坐标之和相等的点存储在邻接表adj【i+j】(一个vector < int > 类型的数组)里面方法三:遍历完了一条对角线拐弯方法四: Z字型逆时针回字型打印1106: 蛇形填数(回字型)打印漏斗等腰三角形

Z字型扫描(有的又叫这是蛇形扫描)

https://www.acwing.com/problem/content/description/3211/

方法一:处在同一对角线(东北指向)上的点 之 行坐标+纵坐标 的和相等,且就是对角线序号

n * n 方阵有2*n-1条对角线,遍历行号,同时根据对角线确定列号(处在同一对角线(东北指向)上的点 之 行坐标+纵坐标 的和相等,且就是对角线序号)

一个矩阵一共有 2n−12n−1 条对角线 把对角线分成两类 右上和左下 对于每一条对角线 都有 x+y=C1 x−y=C2 也就是说 ,对角线的坐标之差/坐标之和是固定的 因此可以利用这个关系来算坐标 最后判断一下边界即可

由于Z字型扫描规律,偶序号对角线上扫描方向是 右上,行号递减;奇序号对角线上扫描方向是 左下,行号递增; (改变遍历行号的顺序就行) 在这里插入图片描述

#include /*run this program using the console pauser or add your own getch, system("pause") or input loop */ using namespace std; int a[505][505]; int main(int argc, char** argv) { int n; cin>>n;//n*n矩阵 for(int i=0;i cin>>a[i][j]; } } int len=(n//奇数号对角线从右上到左下输出 行号增大 偶数号对角线反之 for(int j=0;j for(int j=i;j>=0;j--){ if(j>=0&&j=0&&i-j for(int j=0;j if(i&1){ for(int k=0;k for(int k=adj[i].size()-1;k>=0;k--){ cout for(int j=0;j if(x y=0; flag=1-flag;//相当于遍历完了一条对角线拐弯了这时 } } return 0; } 方法四:

来源 有一点蛇形矩阵的感觉,依次有四种方向【向右/向左下/向下/向右上】,其中向右和向下每次走一步就要转变方向,而向左下和向右上都是走到越界才转向。直到走完 n×n 个数停止。注意走过的位置不能再走,由于矩阵元素都是正数,所以可以在走完每一步后将对应的元素置0用于标记已经走过

#include using namespace std; const int N = 510; int a[N][N], n; int dx[4] = {0, 1, 1, -1}, dy[4] = {1, -1, 0, 1}; int main() { cin >> n; for (int i = 0; i a[i][j]; int i = 0, j = 0, cnt = 0 , t = 0; cout i = x, j = y; cout for(int j=0;j for(int k=i;k>=0;k–){ if(k>=0&&k=0&&i-k//逆时针回字 for(;i=lb;j--)a[i][j]=cnt++;//从右到左 lb++; j++; } for(int i=0;i cout int lb=0; int rb=n-2;//最后一次是从右往左,边界提前缩1 int ub=0; int db=n-1; int i=-1; int j=n-1; int cnt=0; while(cnt a[i][j]=++cnt; } i--;//纠正越界 db--;//缩圈 for(--j;j>=lb;j--){ a[i][j]=++cnt; } j++; lb++; for(--i;i>=ub;i--){ a[i][j]=++cnt; } i++; ub++; for(++j;j for(int y=0;y int n; char ch; cin>>n; // getchar(); cin>>ch; if(n==1){ cout for(int j=1;j int i,j,k; int n; printf("input n:"); scanf("%d",&n); for(i=1;i if(k==1 || k == 2*i-1) { printf("%2c",'*');continue; } printf("%2c",' '); } printf("n"); } for(i=1;i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有