A1128 | 逻辑想象能力、简洁高效美观的代码、memset的使用情景

写了三遍才AC,这真是对智商极大的侮辱

C++代码:

#include <stdio.h>
#include <memory.h>
#include <math.h>
#include <string>
#include <vector>
#include <set>
#include <stack>
#include <queue>
#include <algorithm>
#include <map>


#define I scanf
#define OL puts
#define O printf
#define F(a,b,c) for(a=b;a<c;a++)
#define FF(a,b) for(a=0;a<b;a++)
#define FG(a,b) for(a=b-1;a>=0;a--)
#define LEN 10000
#define MAX 0x06FFFFFF
#define V vector<int>

using namespace std;

int C[3][LEN];//col, diag1, diag2

int main(){
//    freopen("d:/input/A1128.txt","r",stdin);
    int i,n,m;
    scanf("%d",&n);
    while(n-->0){
        scanf("%d",&m);
        memset(C,0,sizeof(C));
        bool ok=1;
        F(i,1,m+1){
            int r=i;
            int c;
            scanf("%d",&c);
            int d1=r-c+m;
            int d2=c-r+m;
            if(!ok) continue;
            if(C[0][c] || C[1][d1] || C[2][d2]){
                ok=0;
            }else{
                C[0][c]=1;
                C[1][d1]=1;
                C[2][d2]=1;
            }
        }
        OL(ok ? "YES" : "NO");
    }
    return 0;
}
View Code

 


1.应快速思考出对角线的ID表达式

2.应写出简洁高效美观的代码,原来的代码感觉写的太愚蠢了,也没有通过最后一个case。然后我在网上看到这段代码(左):

被深深的震撼到了,居然可以写的这么简洁,并且用二维数组代替我原来写的四个数组。然后我删掉了花20分钟写的代码,用了5分钟重写了一遍(右)。

3.memset的使用情景:

memset只能赋值全是0(0x0……0),或者全是1(0xF……F),后者 反映在int上,就是用补码表示的-1。memset的方便之处在于他可以对高维数组进行初始赋值,并且速度相对较快。

4.sizeof的返回值

如果是已经分配好内存的静态数组,如int arr[LEN],sizeof(arr)的返回值就是4*LEN

如果是分配的堆,如int *arr=new int[LEN],sizeof(arr)的返回值就是4

 

posted @ 2018-01-01 16:12  TQCAI  阅读(363)  评论(0编辑  收藏  举报