写了三遍才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; }
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