C/C++の宿題を片付けます 104代目
at TECH
[
2ch
|
▼Menu
]
■コピペモード
□
スレを通常表示
□
オプションモード
□このスレッドの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); }
次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
レスジャンプ
mixiチェック!
Twitterに投稿
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch
4969日前に更新/299 KB
担当:undef