&代表与,计算机专业同学应该都知道这个运算。

1&0=0,0&1=0,1&1=1,0&0=0  也就是说两个变量都为1时,结果才为1

而我遇到i&1是在一道算法题里,i是一个int变量,

场景是  if(i&1)   ,在这要说明的是,这个&是二进制位参与运算,末尾开始,奇数二进制末尾是1,偶数是0,也就是说奇数i&1结果为1,偶数则为0。 这个判断语句也可写为if(i&1==1)

下面来看下例题:

如下图所示,小明用从 11 开始的正整数“蛇形”填充无限大的矩阵。

1 2 6 7 15 ...
3 5 8 14 ...
4 9 13 ...
10 12 ...
11 ...
...

容易看出矩阵第二行第二列中的数是 5。请你计算矩阵中第 20 行第 20 列的数是多少?

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

#include<bits/stdc++.h>
using namespace std;
int a[50][50];
int main()
{
    int idx=0;//用于数自增,是填入的数 
 for(int i=1;i<=40;i++)//通过样例图可以看出,填数规则是斜着填 
 //以i作为行(斜着),奇数行和偶数行每次调转方向 不同,但相同类型行调转方向相同 
 {
     for(int j=0;j<i;j++)//代表列 
     {
         if(i&1==1)//奇数
         {
         	//填数规则可以通过找规律发现,可以拿斜着的前三行找规律判断
			 //奇数行 从左下往右上,行不断减小,列不断增加,我们行列都标记为从1开始
			 //所以j从0取 合适,取1的话i-j变为0 
             a[i-j][j+1]=++idx;
         }
         else
         {
         	//偶数行从右上往左下,行不断增加,列不断减小
			 //每次行跑到了第一行开始调转方向 
             a[j+1][i-j]=++idx;
         }
     }
 }
 cout<<a[20][20];
  return 0;
}

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐