[OI]蛇充填の数の問題を掘り下げ

タイトル:1,2、... N×Nのn×n行列を記入し、蛇行は、いくつかの要件を満たします。例えば、N = 4の場合に正方形です。

    10 11 12 1

    9 16 13 2

    8 15 14 3

    7 6 5 4

空間は、前記(N <= 8)、厳密に必要な出力はありません。

 

ソリューション:

1の#include <stdio.hの>
 2の#include < ストリング・H>
 3  
4  の#define MAXN 20
 5  INT [MAXN] [MAXN]。
6  
7  INT メイン()
 8  {
 9      int型のn、X、Y、TOT = 0 10      のscanf(" %d個"、&N)
11      のmemset(0はsizeof (a)参照)。
12      TOT = [X = 0 ] [Y = N- 1 ] = 1 13      
14      一方(TOT <N * N)
 15      {
 16          ながら(X + 1 <N && [X +!1 ] [Y])++ X] [Y] = ++ TOT。
17          一方(Y- 1 > = 0 && [X] [Y-!1 [X] [ - Y] = ++])TOT。
18          一方(X- 1 > = 0!&& [X- 1 ] [Y])[ - X] [Y] = ++ TOT。
19          一方(Y + 1 <N && [X] [Y +!1 ])[X] [Y ++] = ++ TOT。
20          
21      }
 22      
23      用の(X =0 ; X <N-; X ++ 24      {
 25          のために(Y = 0 ; Y <N-、Y ++ 26である         {
 27              のprintf(" %3D " 、A [X] [Y]);フォーマットの例として//出力
 28          }
 29          のprintf(" \ N- " );
 30      }
 31は、     
32      の戻り 0 ;
 33です }

ここでは詳細のいくつかを探求します:

  抽象的な数学の第一、二次元配列

    我々は、マウスの位置を制御することができないので、我々は、いくつかの順次出力で数で座標系の各平面の位置を突き止めることができます。これは、それがクリアされ、C言語での座標系抽象平面に関し、我々は、2次元アレイを使用します。

   

    各グリッドは、このような抽象的利点は、我々は唯一の私たちが割り当てることができる方法を検討する必要が、どのようにその出力を検討する必要があるということです、座標です。

    另外的一个技巧是:将整个数组初始化为0,这样0就代表是该坐标位置未被占去的状态,可以用!a[x][y}是否为1来判断。并且,无论格子内填了什么,!a[x][y]的值都会是0。

 

  二、简化运算符的使用

    就像书上说的一样,

    tot = a[x = 0][y = n-1] = 1; 

    这句话包含了很大的信息量。不仅使得代码变得简洁,而且没有使程序的易读性丧失。

  三、短路运算符的妙用

    当你不能避免某一条语句会导致下标溢出的时候,使用短路运算符可以很好的解决问题。就比如将!a[x+1][y]放入&&的后面,即使x+1>=n也不会使得下标溢出。

   四、细节问题

    注意观察变量的情况。如果tot的初始值为1,那么下面的句子就要使用tot++。

 

来自:《算法竞赛入门经典》--紫皮书

おすすめ

転載: www.cnblogs.com/nowonder/p/snake-like-fill-in.html