第20講 一般種法による魔方陣ソフトの高速化 
第4話 仮屋崎さんのエレガントな方法その2
void g1(int n,int y,int x){
  int i;
  for(i=x;i<n;i++){
    if(b[y][i]==-1){
      b[y][i]=cn;
      cn++;
    }
  }
  t++;
  if(t<n){
    g2(n,t,t-1);
  }
			 }
			 void g2(int n,int y,int x){
  int i;
  for(i=y;i<n;i++){
    if(b[i][x]==-1){
      b[i][x]=cn;
      cn++;
    }
  }
  if(t<n){
    g1(n,t,t+1);
  }
}
特に解説はいらないと思いますが、
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
| 0 | 0 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | 10 | 
| 1 | -1 | 1 | -1 | -1 | -1 | -1 | -1 | -1 | 11 | -1 | 
| 2 | -1 | -1 | 2 | -1 | -1 | -1 | -1 | 12 | -1 | -1 | 
| 3 | -1 | -1 | -1 | 3 | -1 | -1 | 13 | -1 | -1 | -1 | 
| 4 | -1 | -1 | -1 | -1 | 4 | 14 | -1 | -1 | -1 | -1 | 
| 5 | -1 | -1 | -1 | -1 | 15 | 5 | -1 | -1 | -1 | -1 | 
| 6 | -1 | -1 | -1 | 16 | -1 | -1 | 6 | -1 | -1 | -1 | 
| 7 | -1 | -1 | 17 | -1 | -1 | -1 | -1 | 7 | -1 | -1 | 
| 8 | -1 | 18 | -1 | -1 | -1 | -1 | -1 | -1 | 8 | -1 | 
| 9 | 19 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | 9 | 
セル単位で再帰的呼び出しをしているのではなく、行または列単位で再帰的呼び出しをしています。
こちらの方が、前のものより簡単ですね。
前話で1つ語り落としたことがあります。
g1(n,t,t+1);とg2(n,t,t-1);の色のところです。
(t,t+1)と(t,t-1)の意味は、
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
| 0 | 0 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | 10 | 
| 1 | -1 | 1 | -1 | -1 | -1 | -1 | -1 | -1 | 11 | -1 | 
| 2 | -1 | -1 | 2 | -1 | -1 | -1 | -1 | 12 | -1 | -1 | 
| 3 | -1 | -1 | -1 | 3 | -1 | -1 | 13 | -1 | -1 | -1 | 
| 4 | -1 | -1 | -1 | -1 | 4 | 14 | -1 | -1 | -1 | -1 | 
| 5 | -1 | -1 | -1 | -1 | 15 | 5 | -1 | -1 | -1 | -1 | 
| 6 | -1 | -1 | -1 | 16 | -1 | -1 | 6 | -1 | -1 | -1 | 
| 7 | -1 | -1 | 17 | -1 | -1 | -1 | -1 | 7 | -1 | -1 | 
| 8 | -1 | 18 | -1 | -1 | -1 | -1 | -1 | -1 | 8 | -1 | 
| 9 | 19 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | 9 | 
2つの線です。座標(t、t)なら、対角線でした。ですから、(t、t+1)なら1つ右にずれた直線ですし、
(t、t−1)なら1つ左にずれた直線です。
VC++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual 
Basic入門基礎講座