//N=50で落ちるのはバグの性だったようです。これならN=100でも落ちない。
#include <stdio.h> #include <stdlib.h> #include <time.h> #define N 15
void get_randam(int block[N][N]){ int *p;for(p = &block[0][0]; p <= &block[N-1][N-1]; p++)*p = rand() % 2; }
void paint(int block[N][N], int x, int y){ if( x<0 || y<0 || x>=N || y>=N || block[y][x] != 0)return;
block[y][x] = 2; paint(block, x+1, y);paint(block, x-1, y);paint(block, x, y+1);paint(block, x, y-1); }
void make_ans(int block[N][N]){ int i; for(i = 0; i < N; i++){ paint(block, 0,i);paint(block, N-1,i);paint(block, i,0);paint(block, i,N-1);
} } int main(){int block[N][N], *p, i = 1;srand(time(NULL));get_randam(block);make_ans(block);for(p = &block[0][0]; p <= &block[N-1][N-1]; p++, i++){
switch(*p){case 0: printf(" 1"); break; case 1: printf(" *"); break; case 2: printf(" -"); break; default:printf(" E"); break;
}if(i % N == 0) putchar('\n'); } return 0;}
上のソースは、宿題レスでだいぶ前に俺が適当に問題提示してみた問題の答え(どなたかが答えたソースです)
-**-**
-*-*-*
*-****
**----
の*で囲まれてる所をすべて別の文字に埋めるっていう問題
で、問題出しただけで答えは自分自身わからなかったのですが
この答えのソース見てもどうやって、再帰つかって探索してるのかが
いったいどうやったらこういうのを思いつけるのかがわからないです。
センスもあるんでしょうが、パズルの解法とかの関連ページ見ても
わからずで。
どういう風に、再帰さして結果を出してるのか。
ヒントか、参考になるページとかあれば、どなたか教えてください。