1. 程式人生 > >A1128 | 邏輯想象能力、簡潔高效美觀的代碼、memset的使用情景

A1128 | 邏輯想象能力、簡潔高效美觀的代碼、memset的使用情景

mem 分配 bool ++ bsp math 分享圖片 技術 ()

寫了三遍才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

A1128 | 邏輯想象能力、簡潔高效美觀的代碼、memset的使用情景