魔方阵

 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),若类中有虚函数也不可。

今个运行了下,貌似有问题,不想改了

posted @ 2012-12-08 22:35  加拿大小哥哥  阅读(798)  评论(0编辑  收藏  举报