>>101
,「C/C++の宿題片付けます」のスレで投げ出された問題といてみたら?今あんまりないけど
過去問で以下のソースを実行した16X16の盤面中*で囲まれている部分だけをすべて他の文字に変えなさいという問題で
#include <stdio.h>#include <stdlib.h>#include <time.h>void get_randam(int block[16][16]) {
int *p;for(p = &block[0][0]; p <= &block[15][15]; p++)*p = rand()%2; }
void print_block(int block[16][16]){int i,j;for(i = 0; i < 16; i++){for(j = 0; j < 16; j++){
if(block[i][j] == 0) printf(" +");else printf(" *");}putchar('\n');}}int main(void){int block[16][16] = {0};
srand((unsigned int)time(NULL));get_randam(block);print_block(block);return 0;}
答えが
#include <stdio.h> #include <stdlib.h> #include <time.h> #define N 16
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;}
解ける?俺はとけない。逆に解説して欲しい。再帰をつかってのパズル解法の入門なら
http://www.ic-net.or.jp/home/takaken/がある、あと日系ソフトウェアのページの過去掲載された
例題みたいなのがC言語のもあるhttp://software.nikkeibp.co.jp/software/download/downloadc.html
C言語で何が出来るかが分かるとも思う。掲載ページは、探してくれ。