C/C++の宿題を片付けます 104代目at TECHC/C++の宿題を片付けます 104代目 - 暇つぶし2ch■コピペモード□スレを通常表示□オプションモード□このスレッドのURL■項目テキスト550:デフォルトの名無しさん 08/03/06 20:07:33 >>549 #define HEIGHT 4 #define WIDTH 4 typedef struct tab_board_t{ int num[HEIGHT][WIDTH]; }board_t; int is_solvable(board_t *board){ int ret=1, x, y; for(y=0;y<HEIGHT;y++){ for(x=0;x<WIDTH;x++){ ret=(ret+(board->num[y][x]/WIDTH-y))&1; ret=(ret+((board->num[y][x]%WIDTH)-x))&1; } } return ret; } /* 但し、完成した状態の定義を board_t board={{0,1,2,3},{4,5,6,7},{8,9,10,11},{12,13,14,15}}; とする */ 551:デフォルトの名無しさん 08/03/06 20:34:23 >>550 間違ってるな 552:デフォルトの名無しさん 08/03/06 20:43:44 >>550 {{0,1,2,3},{4,5,6,7},{8,9,10,11},{12,15,14,13}}を、与えると、1が、返ってきて、しまいましたが、、、 未完の、大作と、評価して、おきます 553:550 08/03/06 21:50:12 >>550 の修正版 (完成した状態の定義は board_t board={{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,SPACE}}; とする) #define HEIGHT 4 #define WIDTH 4 #define BOARD_SIZE ((HEIGHT)*(WIDTH)) #define SPACE ((BOARD_SIZE)-1) typedef struct tag_board_t{ int num[BOARD_SIZE]; }board_t; int swap(int *a, int *b){ int c; c=*a; *a=*b; *b=c; return (*a!=SPACE && *b!=SPACE); // 空白との交換はカウントしない } int sign(int a){ return (a>0)?1:(a<0)?-1:0; } // 数値の符号を返すだけ int is_solvable(board_t *board){ int check_pos, swap_pos, target_pos, swap_count=0; int diff_x, diff_y; board_t work; work=*board; for(check_pos=0;check_pos<WIDTH*HEIGHT;check_pos++){ for(target_pos=0;work.num[target_pos]!=check_pos;target_pos++); while(work.num[check_pos]!=check_pos){ diff_x = (check_pos%WIDTH) - (target_pos%WIDTH); diff_y = (check_pos/WIDTH) - (target_pos/WIDTH); if(diff_x) swap_pos=target_pos + sign(diff_x); else swap_pos=target_pos + sign(diff_y)*WIDTH; swap_count+=swap(&work.num[target_pos], &work.num[swap_pos]); target_pos=swap_pos; } } return (swap_count%2==0); } 次ページ最新レス表示レスジャンプ類似スレ一覧スレッドの検索話題のニュースおまかせリストオプションしおりを挟むスレッドに書込スレッドの一覧暇つぶし2ch