标题:这个九宫格程序原理是什么呢?
只看楼主
家力掠
Rank: 2
等 级:论坛游民
帖 子:52
专家分:16
注 册:2015-6-28
结帖率:41.18%
已结贴  问题点数:10 回复次数:5 
这个九宫格程序原理是什么呢?
程序代码:
//输出N*N的数组
//1.先将1填在方阵第一行中间,即(1,(n+1)/2)的位置
//2.一个数填在上一个数的主对角线的上方
//若上一个数的位置是(i,j),下一个数应填在(i1,j1),其中i1=i-1,j1=j-1
//3.若填写的位置下标出界,则出界的值用n替代,即若i-1=0,则取i1=n
//若j-1=0,则取j1=n
//4.若填写的位置没有出界,但已经填有数的话,则应填在上一个数的下面(行减1,列不变)
//即取i1=i-1,j1=j
//5.这样循环直到n*n全部输入到方阵中
#include <iostream>
using namespace std;
int main(void)
{
   //i,j分别表示当前数组的行和列
   //i1,j1分别表示该数(i,j)的对角线上方
   //i1 = i - 1, j1 = j - 1
   int i, j, i1, j1, x, n, a[100][100];  

   cout<<"Input an odd number: ";
   cin>>n;
   //将从1到n的数组都初始化为0
   for(i = 1; i <= n; i++)
      for(j = 1; j <= n; j++)
         a[i][j] = 0;
   //检查是否为奇数,如果为奇数继续程序
  //否则结束程序
   if (n % 2 == 0)
   {
      cout<<"Input error.";
      return 0;
   }
   //执行第一步,先将1填写在方阵第一行中间
   //即(1,(n+1)/2)的位置
   i = 1;
   j = int((n + 1)/2);
   //x从1开始到小等于n*n的数可以填写在方阵中
   x = 1;
   while(n*n >= x)
   {
      a[i][j] = x;   //此时i=1,j=((n+1)/2),即为第一行的中间位置
      x += 1;
      //41-45:将i1的j1分别赋值给i和j,接着将i,j自减1
      //此时a[i][j]的位置在a[i1][j1]的对角线的斜上方
      i1 = i;
      j1 = j;
      i -= 1;
      j -= 1;
      //如果行(i)等于0,则i等于该数组的下界(n)
      if (i == 0) i = n;
      //同理
      if (j == 0) j = n;
      //4.若填写的位置没有出界,但已经填有数的话,则应填在上一个数的下面(行减1,列不变)
      //即取i1=i-1,j1=j
      if (a[i][j] != 0)
      {
         i = i1 + 1;
         j = j1;
      }
   }

   //输出该数组
   for(i = 1; i <= n; i++)
   {
      for(j = 1; j <= n; j++)
         cout<<a[i][j]<<"\t";
      cout<<endl;
   }

   return 0;
}

这是个输出九宫格的程序,感觉每一行要做什么都懂了,合起来就不懂了.请教下论坛的朋友们这个程序的原理是什么?自己写的注释有点多...
搜索更多相关主题的帖子: 九宫格 对角线 
2015-11-10 17:40
仰望星空的
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:50
专家分:248
注 册:2015-9-28
得分:5 
试了一个3*3的,并没有出来九宫格,但是感觉逻辑啥的都对,同求解答~
2015-11-11 10:03
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
得分:5 
不配合图,三两句话根本解释不清楚,你自己百度一下“奇阶幻方”,会得到很清楚的解释。
2015-11-11 12:32
小涛涛
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2015-12-15
得分:0 
回复 3楼 yangfrancis
嗯好吧
2015-12-16 14:11
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
以下是引用仰望星空的在2015-11-11 10:03:10的发言:

试了一个3*3的,并没有出来九宫格,但是感觉逻辑啥的都对,同求解答~
我也试了一下,是可以输出的呀

我将代码简化了一下
程序代码:
#include <iostream>
#include <new>
using namespace std;

int main(void)
{
   cout << "Input an odd number: ";
   size_t n;
   if( !(cin>>n) || n%2!=1 )
       return 1;
   size_t* a = new(std::nothrow) size_t [n*n]();
   if( !a )
       return 2;

   for( size_t i=1,r=0,c=n/2; a[r*n+c]==0; ++i )
   {
       a[r*n+c] = i;

       if( a[(r+n-1)%n*n + (c+n-1)%n] == 0 )
           r=(r+n-1)%n, c=(c+n-1)%n;
       else
           r = (r+1)%n;
   }

   for( size_t i=0; i!=n*n; ++i )
       cout << a[i] << ((i+1)%n==0?'\n':'\t');

   delete[] a;
   return 0;
}

2015-12-17 08:48
wengbin
Rank: 10Rank: 10Rank: 10
来 自:陕西西安
等 级:贵宾
威 望:19
帖 子:370
专家分:1846
注 册:2015-5-8
得分:0 
也学习下
2015-12-17 09:56



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-459070-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027622 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved