1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 5 int main() 6 { 7 int i,j,k,T; 8 cin>>T; 9 while(T--) 10 { 11 int n = 0; 12 cin>>n; 13 int *a = new int[n*n]; 14 // memset(a,0,sizeof(a));用这个初始化会错误 15 for(i=0;i<n;i++) 16 a[i] = 0; 17 //cout<<a[i]<<endl; 18 int x,y;//记录当前填写的位置 19 x = (n -1)/2,y = 0; 20 a[y*n + x] = 1;//在第一行中间填上1。 21 for(i=2; i<=n*n; i++)//需要填入的数 22 { 23 x++;//当前格移到右一列 24 if(x>=n)//移出格就到第一列 25 x = 0; 26 y--;//当前格到上一行 27 if(y<0) 28 y = n - 1; 29 if(a[y*n + x]!=0)//如果当前格被占用就到下一行 30 y++; 31 a[y*n + x] = i;//当前格填入值 32 } 33 //输出 34 for(i=0; i<n; i++) 35 { 36 for(j=0; j<n; j++) 37 { 38 cout<<a[i*n + j]<<" "; 39 } 40 cout<<endl; 41 } 42 delete []a; 43 } 44 return 0; 45 } 46 47
特别注意:memset不能初始化new或者malloc出来的内存,因为sizeof(int *)是4,可以初始化为-1或者0(0的二进制补码全为0,-1的二进制补码全为1),若类中有虚函数也不可。
今个运行了下,貌似有问题,不想改了