SuperCon2013 本選
SuperCon2013 本選に行ってきました。
4位でした。実力は出せたものの詰めが甘いです。
解法は主催者が想定していた通りな感じです。
解法
- がんばって逆にたどるだけ
- GK表とかいう粒子の衝突が起こった時の次の粒子の移動方向の表の変な性質はまったく使っていない。
- GK表は使いにくいので作り替えたのを埋め込んだ
- はじめCPUのプログラムを作ったときにGPUに書き換えやすいように書いたのがよかったのではないかと思った。
- 極力GPUへのデータ転送回数を少なくした。
- 隣接格子点の座標をはじめにCPUで求めておいて配列に格納しGPUでdivergent分岐をしないようにしたら6秒ぐらいはやくなった。
- コードの最初にcudaDeviceSynchronize()を入れるとなぜか4~5秒もはやくなって謎
以下提出したコード(多少編集しました)
/******************************************************************* スーパーコン13の本選課題 入出力用テンプレート 名称 sc13_template.c by T. Yamazaki, O. Watanabe, and T. Endo, Aug. 15, 2013 version 130815-2000 *********************************************************************/ /********* テンプレート用 (1) ここから **********/ #include<stdio.h> #include<stdlib.h> #include<time.h> #include<sys/time.h> //------------ 各種定数(上界値) #define MAXN 500 // 空間の最大サイズ #define MAXM 4000 // 1色あたりの星の最大数( 星の最大数は 3 * MAXM ) #define MAXT 5000 // 最大予測経過時間 #define MAXK 250 // A群の最大数 #define MAXL 100 // B群の最大数 //------------ 遷移ルールのインクルード #include"transition_rule.h" /* #define TRANSITION_RULE_NUM 255 // 遷移ルールの数 struct TransitionRule { int id; // 遷移ルールid ( 普通は使用せず ) int length; // pattern, nextの長さ( 衝突している星の数 ) int pattern[ 8 ]; // 衝突している星の向きの集合を表す列 int next[ 8 ]; // 衝突後の各星の向き( 衝突前に向きが pattern[ i ] だった星は衝突後の向きは next[ i ] になる ) }; TransitionRule transition_rules[ TRANSITION_RULE_NUM ]; // 全ての遷移ルールの集合を表す列 // */ //------------ 入出力用構造体 typedef struct Star_{ int x; // x座標 int y; // y座標 int dir; // 移動方向 int color; // 色 } Star; //------------ 入出力用変数 int N; // 空間のサイズ( 幅, 高さ ) int M; // 1色あたりの星の数( 星の合計数は 3 * M ) int T; // A群とB群の間の予測経過時間 int K; // A群のサイズ int L; // B群のサイズ Star A[ MAXK ][ 3 * MAXM ]; // A群を表すデータ Star B[ MAXL ][ 3 * MAXM ]; // B群を表すデータ int answer[ MAXL ]; // 出力用 // answer[ i ] には B[ i ] の過去であるようなA群のインデックスを格納する //------------ 入出力用関数 // 入力用 void input() { int i, c, j; scanf( " %d %d %d %d %d", &N, &M, &T, &K, &L ); for( i = 0; i < K; i++ ){ for( c = 0; c < 3; c++ ){ for( j = 0; j < M; j++ ){ Star *cur = &A[ i ][ c * M + j ]; scanf( " %d %d %d", &cur->x, &cur->y, &cur->dir ); cur->color = c; } } } for( i = 0; i < L; i++ ){ for( c = 0; c < 3; c++ ){ for( j = 0; j < M; j++ ){ Star *cur = &B[ i ][ c * M + j ]; scanf( " %d %d %d", &cur->x, &cur->y, &cur->dir ); cur->color = c; } } } } // 出力用 void output() { int i; for( i = 0; i < L; i++ ){ if( i > 0 ){ printf( " " ); } printf( "%d", answer[ i ] ); } printf( "\n" ); } /********* テンプレート用 (1) ここまで **********/ /********* 以下に各自で使うプログラムの変数や手続きの定義を書く **********/ #include <string.h> #define EMPTY -1 #define BIT(a,k) (a + (1 << k)) //a の k 番目の BIT を 1 にする #define MAXN_ 512 // [t][x][y][k] #define IDXN4(i,x,y,k,n) ((i&1)*(n)*(n)*8 + (x)*(n)*8 + (y)*8 + (k)) // [t][x][y] #define IDXN3(i,x,y,n) ((i&1)*(n)*(n) + (x)*(n) + (y)) char univ_n[2 * MAXN_ * MAXN_]; //宇宙[i][j]に存在する星の個数 __device__ char univ_vD[2 * MAXN_ * MAXN_ * 8]; // 0~7...方向 EMPTY...星なし __device__ char univ_cD[2 * MAXN_ * MAXN_ * 8]; // 0,1,2...色 EMPTY...星なし __device__ char univ_nD[2 * MAXN_ * MAXN_]; //宇宙[i][j]に存在する星の個数 int dx[8] = {-1, 0, 1, 1, 1, 0, -1, -1}; int dy[8] = { 1, 1, 1, 0, -1, -1, -1, 0}; __device__ int dxD[8] = {-1, 0, 1, 1, 1, 0, -1, -1}; __device__ int dyD[8] = { 1, 1, 1, 0, -1, -1, -1, 0}; int adjx[MAXN][8]; int adjy[MAXN][8]; __device__ int adjxD[MAXN][8]; __device__ int adjyD[MAXN][8]; void *adjxD_p, *adjyD_p; __device__ Star BD[MAXL][3 * MAXM]; void *BD_p; #define IDXN_UA(u,x,y,N) ((u)*(N)*(N) + (x)*(N) + y) #define IDN_UA(u,x,y) ((u)*MAXN*MAXN + (x)*MAXN + y) char univA_v[MAXK * MAXN * MAXN]; // 0~7...方向 EMPTY...星なし 宇宙 A char univA_c[MAXK * MAXN * MAXN]; // 0,1,2...色 EMPTY...星なし 宇宙 A __device__ char univA_vD[MAXK * MAXN * MAXN]; // 0~7...方向 EMPTY...星なし 宇宙 A __device__ char univA_cD[MAXK * MAXN * MAXN]; // 0,1,2...色 EMPTY...星なし 宇宙 A __device__ TransitionRule new_transition_rulesD[256] = { { 0, 0, {0, 0, 0, 0, 0, 0, 0, 0, }, {4, 4, 4, 4, 4, 4, 4, 4, }}, { 1, 1, {0, 0, 0, 0, 0, 0, 0, 0, }, {0, 4, 4, 4, 4, 4, 4, 4, }}, { 2, 1, {1, 0, 0, 0, 0, 0, 0, 0, }, {1, 4, 4, 4, 4, 4, 4, 4, }}, { 3, 2, {0, 1, 0, 0, 0, 0, 0, 0, }, {1, 0, 4, 4, 4, 4, 4, 4, }}, { 4, 1, {2, 0, 0, 0, 0, 0, 0, 0, }, {2, 4, 4, 4, 4, 4, 4, 4, }}, { 5, 2, {0, 2, 0, 0, 0, 0, 0, 0, }, {2, 0, 4, 4, 4, 4, 4, 4, }}, { 6, 2, {1, 2, 0, 0, 0, 0, 0, 0, }, {2, 1, 4, 4, 4, 4, 4, 4, }}, { 7, 3, {0, 1, 2, 0, 0, 0, 0, 0, }, {2, 1, 0, 4, 4, 4, 4, 4, }}, { 8, 1, {3, 0, 0, 0, 0, 0, 0, 0, }, {3, 4, 4, 4, 4, 4, 4, 4, }}, { 9, 2, {0, 3, 0, 0, 0, 0, 0, 0, }, {3, 0, 4, 4, 4, 4, 4, 4, }}, { 10, 2, {1, 3, 0, 0, 0, 0, 0, 0, }, {3, 1, 4, 4, 4, 4, 4, 4, }}, { 11, 3, {0, 1, 3, 0, 0, 0, 0, 0, }, {3, 1, 0, 4, 4, 4, 4, 4, }}, { 12, 2, {2, 3, 0, 0, 0, 0, 0, 0, }, {3, 2, 4, 4, 4, 4, 4, 4, }}, { 13, 3, {0, 2, 3, 0, 0, 0, 0, 0, }, {3, 2, 0, 4, 4, 4, 4, 4, }}, { 14, 3, {1, 2, 3, 0, 0, 0, 0, 0, }, {3, 2, 1, 4, 4, 4, 4, 4, }}, { 15, 4, {0, 1, 2, 3, 0, 0, 0, 0, }, {3, 1, 2, 0, 4, 4, 4, 4, }}, { 16, 1, {4, 0, 0, 0, 0, 0, 0, 0, }, {4, 4, 4, 4, 4, 4, 4, 4, }}, { 17, 2, {0, 4, 0, 0, 0, 0, 0, 0, }, {4, 0, 4, 4, 4, 4, 4, 4, }}, { 18, 2, {1, 4, 0, 0, 0, 0, 0, 0, }, {4, 1, 4, 4, 4, 4, 4, 4, }}, { 19, 3, {0, 1, 4, 0, 0, 0, 0, 0, }, {4, 1, 0, 4, 4, 4, 4, 4, }}, { 20, 2, {2, 4, 0, 0, 0, 0, 0, 0, }, {4, 2, 4, 4, 4, 4, 4, 4, }}, { 21, 3, {0, 2, 4, 0, 0, 0, 0, 0, }, {4, 2, 0, 4, 4, 4, 4, 4, }}, { 22, 3, {1, 2, 4, 0, 0, 0, 0, 0, }, {4, 2, 1, 4, 4, 4, 4, 4, }}, { 23, 4, {0, 1, 2, 4, 0, 0, 0, 0, }, {4, 1, 2, 0, 4, 4, 4, 4, }}, { 24, 2, {3, 4, 0, 0, 0, 0, 0, 0, }, {4, 3, 4, 4, 4, 4, 4, 4, }}, { 25, 3, {0, 3, 4, 0, 0, 0, 0, 0, }, {4, 3, 0, 4, 4, 4, 4, 4, }}, { 26, 3, {1, 3, 4, 0, 0, 0, 0, 0, }, {4, 3, 1, 4, 4, 4, 4, 4, }}, { 27, 4, {0, 1, 3, 4, 0, 0, 0, 0, }, {4, 1, 3, 0, 4, 4, 4, 4, }}, { 28, 3, {2, 3, 4, 0, 0, 0, 0, 0, }, {4, 3, 2, 4, 4, 4, 4, 4, }}, { 29, 4, {0, 2, 3, 4, 0, 0, 0, 0, }, {4, 2, 3, 0, 4, 4, 4, 4, }}, { 30, 4, {1, 2, 3, 4, 0, 0, 0, 0, }, {4, 2, 3, 1, 4, 4, 4, 4, }}, { 31, 5, {0, 1, 2, 3, 4, 0, 0, 0, }, {4, 1, 2, 3, 0, 4, 4, 4, }}, { 32, 1, {5, 0, 0, 0, 0, 0, 0, 0, }, {5, 4, 4, 4, 4, 4, 4, 4, }}, { 33, 2, {0, 5, 0, 0, 0, 0, 0, 0, }, {5, 0, 4, 4, 4, 4, 4, 4, }}, { 34, 2, {1, 5, 0, 0, 0, 0, 0, 0, }, {5, 1, 4, 4, 4, 4, 4, 4, }}, { 35, 3, {0, 1, 5, 0, 0, 0, 0, 0, }, {0, 5, 1, 4, 4, 4, 4, 4, }}, { 36, 2, {2, 5, 0, 0, 0, 0, 0, 0, }, {5, 2, 4, 4, 4, 4, 4, 4, }}, { 37, 3, {0, 2, 5, 0, 0, 0, 0, 0, }, {4, 6, 1, 4, 4, 4, 4, 4, }}, { 38, 3, {1, 2, 5, 0, 0, 0, 0, 0, }, {5, 2, 1, 4, 4, 4, 4, 4, }}, { 39, 4, {0, 1, 2, 5, 0, 0, 0, 0, }, {0, 5, 2, 1, 4, 4, 4, 4, }}, { 40, 2, {3, 5, 0, 0, 0, 0, 0, 0, }, {5, 3, 4, 4, 4, 4, 4, 4, }}, { 41, 3, {0, 3, 5, 0, 0, 0, 0, 0, }, {0, 5, 3, 4, 4, 4, 4, 4, }}, { 42, 3, {1, 3, 5, 0, 0, 0, 0, 0, }, {5, 3, 1, 4, 4, 4, 4, 4, }}, { 43, 4, {0, 1, 3, 5, 0, 0, 0, 0, }, {3, 5, 0, 1, 4, 4, 4, 4, }}, { 44, 3, {2, 3, 5, 0, 0, 0, 0, 0, }, {5, 3, 2, 4, 4, 4, 4, 4, }}, { 45, 4, {0, 2, 3, 5, 0, 0, 0, 0, }, {3, 2, 0, 5, 4, 4, 4, 4, }}, { 46, 4, {1, 2, 3, 5, 0, 0, 0, 0, }, {5, 2, 3, 1, 4, 4, 4, 4, }}, { 47, 5, {0, 1, 2, 3, 5, 0, 0, 0, }, {0, 5, 2, 3, 1, 4, 4, 4, }}, { 48, 2, {4, 5, 0, 0, 0, 0, 0, 0, }, {5, 4, 4, 4, 4, 4, 4, 4, }}, { 49, 3, {0, 4, 5, 0, 0, 0, 0, 0, }, {4, 0, 5, 4, 4, 4, 4, 4, }}, { 50, 3, {1, 4, 5, 0, 0, 0, 0, 0, }, {5, 4, 1, 4, 4, 4, 4, 4, }}, { 51, 4, {0, 1, 4, 5, 0, 0, 0, 0, }, {4, 5, 0, 1, 4, 4, 4, 4, }}, { 52, 3, {2, 4, 5, 0, 0, 0, 0, 0, }, {5, 4, 2, 4, 4, 4, 4, 4, }}, { 53, 4, {0, 2, 4, 5, 0, 0, 0, 0, }, {4, 2, 0, 5, 4, 4, 4, 4, }}, { 54, 4, {1, 2, 4, 5, 0, 0, 0, 0, }, {5, 2, 4, 1, 4, 4, 4, 4, }}, { 55, 5, {0, 1, 2, 4, 5, 0, 0, 0, }, {4, 5, 2, 0, 1, 4, 4, 4, }}, { 56, 3, {3, 4, 5, 0, 0, 0, 0, 0, }, {5, 4, 3, 4, 4, 4, 4, 4, }}, { 57, 4, {0, 3, 4, 5, 0, 0, 0, 0, }, {4, 3, 0, 5, 4, 4, 4, 4, }}, { 58, 4, {1, 3, 4, 5, 0, 0, 0, 0, }, {5, 3, 4, 1, 4, 4, 4, 4, }}, { 59, 5, {0, 1, 3, 4, 5, 0, 0, 0, }, {4, 5, 3, 0, 1, 4, 4, 4, }}, { 60, 4, {2, 3, 4, 5, 0, 0, 0, 0, }, {5, 3, 4, 2, 4, 4, 4, 4, }}, { 61, 5, {0, 2, 3, 4, 5, 0, 0, 0, }, {4, 2, 3, 0, 5, 4, 4, 4, }}, { 62, 5, {1, 2, 3, 4, 5, 0, 0, 0, }, {5, 2, 3, 4, 1, 4, 4, 4, }}, { 63, 6, {0, 1, 2, 3, 4, 5, 0, 0, }, {4, 5, 2, 3, 0, 1, 4, 4, }}, { 64, 1, {6, 0, 0, 0, 0, 0, 0, 0, }, {6, 4, 4, 4, 4, 4, 4, 4, }}, { 65, 2, {0, 6, 0, 0, 0, 0, 0, 0, }, {6, 0, 4, 4, 4, 4, 4, 4, }}, { 66, 2, {1, 6, 0, 0, 0, 0, 0, 0, }, {6, 1, 4, 4, 4, 4, 4, 4, }}, { 67, 3, {0, 1, 6, 0, 0, 0, 0, 0, }, {0, 6, 1, 4, 4, 4, 4, 4, }}, { 68, 2, {2, 6, 0, 0, 0, 0, 0, 0, }, {6, 2, 4, 4, 4, 4, 4, 4, }}, { 69, 3, {0, 2, 6, 0, 0, 0, 0, 0, }, {0, 6, 2, 4, 4, 4, 4, 4, }}, { 70, 3, {1, 2, 6, 0, 0, 0, 0, 0, }, {1, 6, 2, 4, 4, 4, 4, 4, }}, { 71, 4, {0, 1, 2, 6, 0, 0, 0, 0, }, {0, 1, 6, 2, 4, 4, 4, 4, }}, { 72, 2, {3, 6, 0, 0, 0, 0, 0, 0, }, {6, 3, 4, 4, 4, 4, 4, 4, }}, { 73, 3, {0, 3, 6, 0, 0, 0, 0, 0, }, {4, 7, 2, 4, 4, 4, 4, 4, }}, { 74, 3, {1, 3, 6, 0, 0, 0, 0, 0, }, {3, 1, 6, 4, 4, 4, 4, 4, }}, { 75, 4, {0, 1, 3, 6, 0, 0, 0, 0, }, {0, 6, 3, 1, 4, 4, 4, 4, }}, { 76, 3, {2, 3, 6, 0, 0, 0, 0, 0, }, {6, 3, 2, 4, 4, 4, 4, 4, }}, { 77, 4, {0, 2, 3, 6, 0, 0, 0, 0, }, {0, 6, 3, 2, 4, 4, 4, 4, }}, { 78, 4, {1, 2, 3, 6, 0, 0, 0, 0, }, {1, 6, 3, 2, 4, 4, 4, 4, }}, { 79, 5, {0, 1, 2, 3, 6, 0, 0, 0, }, {0, 1, 6, 3, 2, 4, 4, 4, }}, { 80, 2, {4, 6, 0, 0, 0, 0, 0, 0, }, {6, 4, 4, 4, 4, 4, 4, 4, }}, { 81, 3, {0, 4, 6, 0, 0, 0, 0, 0, }, {4, 0, 6, 4, 4, 4, 4, 4, }}, { 82, 3, {1, 4, 6, 0, 0, 0, 0, 0, }, {5, 0, 2, 4, 4, 4, 4, 4, }}, { 83, 4, {0, 1, 4, 6, 0, 0, 0, 0, }, {4, 1, 0, 6, 4, 4, 4, 4, }}, { 84, 3, {2, 4, 6, 0, 0, 0, 0, 0, }, {6, 4, 2, 4, 4, 4, 4, 4, }}, { 85, 4, {0, 2, 4, 6, 0, 0, 0, 0, }, {4, 6, 0, 2, 4, 4, 4, 4, }}, { 86, 4, {1, 2, 4, 6, 0, 0, 0, 0, }, {1, 6, 4, 2, 4, 4, 4, 4, }}, { 87, 5, {0, 1, 2, 4, 6, 0, 0, 0, }, {4, 1, 6, 0, 2, 4, 4, 4, }}, { 88, 3, {3, 4, 6, 0, 0, 0, 0, 0, }, {6, 4, 3, 4, 4, 4, 4, 4, }}, { 89, 4, {0, 3, 4, 6, 0, 0, 0, 0, }, {4, 3, 0, 6, 4, 4, 4, 4, }}, { 90, 4, {1, 3, 4, 6, 0, 0, 0, 0, }, {1, 6, 4, 3, 4, 4, 4, 4, }}, { 91, 5, {0, 1, 3, 4, 6, 0, 0, 0, }, {4, 1, 3, 0, 6, 4, 4, 4, }}, { 92, 4, {2, 3, 4, 6, 0, 0, 0, 0, }, {6, 3, 4, 2, 4, 4, 4, 4, }}, { 93, 5, {0, 2, 3, 4, 6, 0, 0, 0, }, {4, 6, 3, 0, 2, 4, 4, 4, }}, { 94, 5, {1, 2, 3, 4, 6, 0, 0, 0, }, {1, 6, 3, 4, 2, 4, 4, 4, }}, { 95, 6, {0, 1, 2, 3, 4, 6, 0, 0, }, {4, 1, 6, 3, 0, 2, 4, 4, }}, { 96, 2, {5, 6, 0, 0, 0, 0, 0, 0, }, {6, 5, 4, 4, 4, 4, 4, 4, }}, { 97, 3, {0, 5, 6, 0, 0, 0, 0, 0, }, {5, 0, 6, 4, 4, 4, 4, 4, }}, { 98, 3, {1, 5, 6, 0, 0, 0, 0, 0, }, {5, 1, 6, 4, 4, 4, 4, 4, }}, { 99, 4, {0, 1, 5, 6, 0, 0, 0, 0, }, {0, 5, 1, 6, 4, 4, 4, 4, }}, {100, 3, {2, 5, 6, 0, 0, 0, 0, 0, }, {6, 5, 2, 4, 4, 4, 4, 4, }}, {101, 4, {0, 2, 5, 6, 0, 0, 0, 0, }, {0, 6, 5, 2, 4, 4, 4, 4, }}, {102, 4, {1, 2, 5, 6, 0, 0, 0, 0, }, {5, 6, 1, 2, 4, 4, 4, 4, }}, {103, 5, {0, 1, 2, 5, 6, 0, 0, 0, }, {0, 5, 6, 1, 2, 4, 4, 4, }}, {104, 3, {3, 5, 6, 0, 0, 0, 0, 0, }, {6, 5, 3, 4, 4, 4, 4, 4, }}, {105, 4, {0, 3, 5, 6, 0, 0, 0, 0, }, {5, 3, 0, 6, 4, 4, 4, 4, }}, {106, 4, {1, 3, 5, 6, 0, 0, 0, 0, }, {5, 6, 1, 3, 4, 4, 4, 4, }}, {107, 5, {0, 1, 3, 5, 6, 0, 0, 0, }, {0, 5, 3, 1, 6, 4, 4, 4, }}, {108, 4, {2, 3, 5, 6, 0, 0, 0, 0, }, {6, 3, 5, 2, 4, 4, 4, 4, }}, {109, 5, {0, 2, 3, 5, 6, 0, 0, 0, }, {0, 6, 3, 5, 2, 4, 4, 4, }}, {110, 5, {1, 2, 3, 5, 6, 0, 0, 0, }, {5, 6, 3, 1, 2, 4, 4, 4, }}, {111, 6, {0, 1, 2, 3, 5, 6, 0, 0, }, {0, 5, 6, 3, 1, 2, 4, 4, }}, {112, 3, {4, 5, 6, 0, 0, 0, 0, 0, }, {6, 5, 4, 4, 4, 4, 4, 4, }}, {113, 4, {0, 4, 5, 6, 0, 0, 0, 0, }, {4, 0, 5, 6, 4, 4, 4, 4, }}, {114, 4, {1, 4, 5, 6, 0, 0, 0, 0, }, {5, 4, 1, 6, 4, 4, 4, 4, }}, {115, 5, {0, 1, 4, 5, 6, 0, 0, 0, }, {4, 5, 0, 1, 6, 4, 4, 4, }}, {116, 4, {2, 4, 5, 6, 0, 0, 0, 0, }, {6, 4, 5, 2, 4, 4, 4, 4, }}, {117, 5, {0, 2, 4, 5, 6, 0, 0, 0, }, {4, 6, 0, 5, 2, 4, 4, 4, }}, {118, 5, {1, 2, 4, 5, 6, 0, 0, 0, }, {5, 6, 4, 1, 2, 4, 4, 4, }}, {119, 6, {0, 1, 2, 4, 5, 6, 0, 0, }, {4, 5, 6, 0, 1, 2, 4, 4, }}, {120, 4, {3, 4, 5, 6, 0, 0, 0, 0, }, {6, 4, 5, 3, 4, 4, 4, 4, }}, {121, 5, {0, 3, 4, 5, 6, 0, 0, 0, }, {4, 3, 0, 5, 6, 4, 4, 4, }}, {122, 5, {1, 3, 4, 5, 6, 0, 0, 0, }, {5, 3, 4, 1, 6, 4, 4, 4, }}, {123, 6, {0, 1, 3, 4, 5, 6, 0, 0, }, {4, 5, 3, 0, 1, 6, 4, 4, }}, {124, 5, {2, 3, 4, 5, 6, 0, 0, 0, }, {6, 3, 4, 5, 2, 4, 4, 4, }}, {125, 6, {0, 2, 3, 4, 5, 6, 0, 0, }, {4, 6, 3, 0, 5, 2, 4, 4, }}, {126, 6, {1, 2, 3, 4, 5, 6, 0, 0, }, {5, 6, 3, 4, 1, 2, 4, 4, }}, {127, 7, {0, 1, 2, 3, 4, 5, 6, 0, }, {4, 5, 6, 3, 0, 1, 2, 4, }}, {128, 1, {7, 0, 0, 0, 0, 0, 0, 0, }, {7, 4, 4, 4, 4, 4, 4, 4, }}, {129, 2, {0, 7, 0, 0, 0, 0, 0, 0, }, {7, 0, 4, 4, 4, 4, 4, 4, }}, {130, 2, {1, 7, 0, 0, 0, 0, 0, 0, }, {7, 1, 4, 4, 4, 4, 4, 4, }}, {131, 3, {0, 1, 7, 0, 0, 0, 0, 0, }, {0, 7, 1, 4, 4, 4, 4, 4, }}, {132, 2, {2, 7, 0, 0, 0, 0, 0, 0, }, {7, 2, 4, 4, 4, 4, 4, 4, }}, {133, 3, {0, 2, 7, 0, 0, 0, 0, 0, }, {0, 7, 2, 4, 4, 4, 4, 4, }}, {134, 3, {1, 2, 7, 0, 0, 0, 0, 0, }, {1, 7, 2, 4, 4, 4, 4, 4, }}, {135, 4, {0, 1, 2, 7, 0, 0, 0, 0, }, {0, 1, 7, 2, 4, 4, 4, 4, }}, {136, 2, {3, 7, 0, 0, 0, 0, 0, 0, }, {7, 3, 4, 4, 4, 4, 4, 4, }}, {137, 3, {0, 3, 7, 0, 0, 0, 0, 0, }, {0, 7, 3, 4, 4, 4, 4, 4, }}, {138, 3, {1, 3, 7, 0, 0, 0, 0, 0, }, {1, 7, 3, 4, 4, 4, 4, 4, }}, {139, 4, {0, 1, 3, 7, 0, 0, 0, 0, }, {0, 1, 7, 3, 4, 4, 4, 4, }}, {140, 3, {2, 3, 7, 0, 0, 0, 0, 0, }, {2, 7, 3, 4, 4, 4, 4, 4, }}, {141, 4, {0, 2, 3, 7, 0, 0, 0, 0, }, {0, 2, 7, 3, 4, 4, 4, 4, }}, {142, 4, {1, 2, 3, 7, 0, 0, 0, 0, }, {1, 2, 7, 3, 4, 4, 4, 4, }}, {143, 5, {0, 1, 2, 3, 7, 0, 0, 0, }, {0, 1, 2, 7, 3, 4, 4, 4, }}, {144, 2, {4, 7, 0, 0, 0, 0, 0, 0, }, {7, 4, 4, 4, 4, 4, 4, 4, }}, {145, 3, {0, 4, 7, 0, 0, 0, 0, 0, }, {4, 0, 7, 4, 4, 4, 4, 4, }}, {146, 3, {1, 4, 7, 0, 0, 0, 0, 0, }, {7, 4, 1, 4, 4, 4, 4, 4, }}, {147, 4, {0, 1, 4, 7, 0, 0, 0, 0, }, {4, 1, 0, 7, 4, 4, 4, 4, }}, {148, 3, {2, 4, 7, 0, 0, 0, 0, 0, }, {6, 0, 3, 4, 4, 4, 4, 4, }}, {149, 4, {0, 2, 4, 7, 0, 0, 0, 0, }, {4, 2, 0, 7, 4, 4, 4, 4, }}, {150, 4, {1, 2, 4, 7, 0, 0, 0, 0, }, {4, 2, 1, 7, 4, 4, 4, 4, }}, {151, 5, {0, 1, 2, 4, 7, 0, 0, 0, }, {4, 1, 2, 0, 7, 4, 4, 4, }}, {152, 3, {3, 4, 7, 0, 0, 0, 0, 0, }, {7, 4, 3, 4, 4, 4, 4, 4, }}, {153, 4, {0, 3, 4, 7, 0, 0, 0, 0, }, {4, 7, 0, 3, 4, 4, 4, 4, }}, {154, 4, {1, 3, 4, 7, 0, 0, 0, 0, }, {4, 7, 1, 3, 4, 4, 4, 4, }}, {155, 5, {0, 1, 3, 4, 7, 0, 0, 0, }, {4, 1, 7, 0, 3, 4, 4, 4, }}, {156, 4, {2, 3, 4, 7, 0, 0, 0, 0, }, {2, 7, 4, 3, 4, 4, 4, 4, }}, {157, 5, {0, 2, 3, 4, 7, 0, 0, 0, }, {4, 2, 7, 0, 3, 4, 4, 4, }}, {158, 5, {1, 2, 3, 4, 7, 0, 0, 0, }, {1, 2, 7, 4, 3, 4, 4, 4, }}, {159, 6, {0, 1, 2, 3, 4, 7, 0, 0, }, {4, 1, 2, 7, 0, 3, 4, 4, }}, {160, 2, {5, 7, 0, 0, 0, 0, 0, 0, }, {7, 5, 4, 4, 4, 4, 4, 4, }}, {161, 3, {0, 5, 7, 0, 0, 0, 0, 0, }, {5, 0, 7, 4, 4, 4, 4, 4, }}, {162, 3, {1, 5, 7, 0, 0, 0, 0, 0, }, {5, 1, 7, 4, 4, 4, 4, 4, }}, {163, 4, {0, 1, 5, 7, 0, 0, 0, 0, }, {0, 5, 1, 7, 4, 4, 4, 4, }}, {164, 3, {2, 5, 7, 0, 0, 0, 0, 0, }, {2, 7, 5, 4, 4, 4, 4, 4, }}, {165, 4, {0, 2, 5, 7, 0, 0, 0, 0, }, {0, 7, 5, 2, 4, 4, 4, 4, }}, {166, 4, {1, 2, 5, 7, 0, 0, 0, 0, }, {5, 7, 1, 2, 4, 4, 4, 4, }}, {167, 5, {0, 1, 2, 5, 7, 0, 0, 0, }, {0, 5, 2, 1, 7, 4, 4, 4, }}, {168, 3, {3, 5, 7, 0, 0, 0, 0, 0, }, {7, 5, 3, 4, 4, 4, 4, 4, }}, {169, 4, {0, 3, 5, 7, 0, 0, 0, 0, }, {5, 7, 0, 3, 4, 4, 4, 4, }}, {170, 4, {1, 3, 5, 7, 0, 0, 0, 0, }, {5, 7, 1, 3, 4, 4, 4, 4, }}, {171, 5, {0, 1, 3, 5, 7, 0, 0, 0, }, {0, 5, 7, 1, 3, 4, 4, 4, }}, {172, 4, {2, 3, 5, 7, 0, 0, 0, 0, }, {5, 7, 2, 3, 4, 4, 4, 4, }}, {173, 5, {0, 2, 3, 5, 7, 0, 0, 0, }, {0, 2, 7, 5, 3, 4, 4, 4, }}, {174, 5, {1, 2, 3, 5, 7, 0, 0, 0, }, {5, 2, 7, 1, 3, 4, 4, 4, }}, {175, 6, {0, 1, 2, 3, 5, 7, 0, 0, }, {0, 5, 2, 7, 1, 3, 4, 4, }}, {176, 3, {4, 5, 7, 0, 0, 0, 0, 0, }, {7, 5, 4, 4, 4, 4, 4, 4, }}, {177, 4, {0, 4, 5, 7, 0, 0, 0, 0, }, {4, 0, 5, 7, 4, 4, 4, 4, }}, {178, 4, {1, 4, 5, 7, 0, 0, 0, 0, }, {5, 7, 1, 4, 4, 4, 4, 4, }}, {179, 5, {0, 1, 4, 5, 7, 0, 0, 0, }, {4, 5, 0, 1, 7, 4, 4, 4, }}, {180, 4, {2, 4, 5, 7, 0, 0, 0, 0, }, {5, 4, 2, 7, 4, 4, 4, 4, }}, {181, 5, {0, 2, 4, 5, 7, 0, 0, 0, }, {4, 2, 0, 5, 7, 4, 4, 4, }}, {182, 5, {1, 2, 4, 5, 7, 0, 0, 0, }, {5, 2, 4, 1, 7, 4, 4, 4, }}, {183, 6, {0, 1, 2, 4, 5, 7, 0, 0, }, {4, 5, 2, 0, 1, 7, 4, 4, }}, {184, 4, {3, 4, 5, 7, 0, 0, 0, 0, }, {7, 4, 5, 3, 4, 4, 4, 4, }}, {185, 5, {0, 3, 4, 5, 7, 0, 0, 0, }, {4, 7, 0, 5, 3, 4, 4, 4, }}, {186, 5, {1, 3, 4, 5, 7, 0, 0, 0, }, {5, 7, 4, 1, 3, 4, 4, 4, }}, {187, 6, {0, 1, 3, 4, 5, 7, 0, 0, }, {4, 5, 7, 0, 1, 3, 4, 4, }}, {188, 5, {2, 3, 4, 5, 7, 0, 0, 0, }, {2, 7, 4, 5, 3, 4, 4, 4, }}, {189, 6, {0, 2, 3, 4, 5, 7, 0, 0, }, {4, 2, 7, 0, 5, 3, 4, 4, }}, {190, 6, {1, 2, 3, 4, 5, 7, 0, 0, }, {5, 2, 7, 4, 1, 3, 4, 4, }}, {191, 7, {0, 1, 2, 3, 4, 5, 7, 0, }, {4, 5, 2, 7, 0, 1, 3, 4, }}, {192, 2, {6, 7, 0, 0, 0, 0, 0, 0, }, {7, 6, 4, 4, 4, 4, 4, 4, }}, {193, 3, {0, 6, 7, 0, 0, 0, 0, 0, }, {6, 0, 7, 4, 4, 4, 4, 4, }}, {194, 3, {1, 6, 7, 0, 0, 0, 0, 0, }, {6, 1, 7, 4, 4, 4, 4, 4, }}, {195, 4, {0, 1, 6, 7, 0, 0, 0, 0, }, {0, 6, 1, 7, 4, 4, 4, 4, }}, {196, 3, {2, 6, 7, 0, 0, 0, 0, 0, }, {6, 2, 7, 4, 4, 4, 4, 4, }}, {197, 4, {0, 2, 6, 7, 0, 0, 0, 0, }, {0, 6, 2, 7, 4, 4, 4, 4, }}, {198, 4, {1, 2, 6, 7, 0, 0, 0, 0, }, {1, 6, 2, 7, 4, 4, 4, 4, }}, {199, 5, {0, 1, 2, 6, 7, 0, 0, 0, }, {0, 1, 6, 2, 7, 4, 4, 4, }}, {200, 3, {3, 6, 7, 0, 0, 0, 0, 0, }, {7, 6, 3, 4, 4, 4, 4, 4, }}, {201, 4, {0, 3, 6, 7, 0, 0, 0, 0, }, {0, 7, 6, 3, 4, 4, 4, 4, }}, {202, 4, {1, 3, 6, 7, 0, 0, 0, 0, }, {6, 7, 1, 3, 4, 4, 4, 4, }}, {203, 5, {0, 1, 3, 6, 7, 0, 0, 0, }, {0, 1, 7, 6, 3, 4, 4, 4, }}, {204, 4, {2, 3, 6, 7, 0, 0, 0, 0, }, {6, 7, 2, 3, 4, 4, 4, 4, }}, {205, 5, {0, 2, 3, 6, 7, 0, 0, 0, }, {0, 6, 7, 2, 3, 4, 4, 4, }}, {206, 5, {1, 2, 3, 6, 7, 0, 0, 0, }, {1, 6, 7, 2, 3, 4, 4, 4, }}, {207, 6, {0, 1, 2, 3, 6, 7, 0, 0, }, {0, 1, 6, 7, 2, 3, 4, 4, }}, {208, 3, {4, 6, 7, 0, 0, 0, 0, 0, }, {7, 6, 4, 4, 4, 4, 4, 4, }}, {209, 4, {0, 4, 6, 7, 0, 0, 0, 0, }, {4, 0, 6, 7, 4, 4, 4, 4, }}, {210, 4, {1, 4, 6, 7, 0, 0, 0, 0, }, {1, 7, 6, 4, 4, 4, 4, 4, }}, {211, 5, {0, 1, 4, 6, 7, 0, 0, 0, }, {4, 1, 0, 6, 7, 4, 4, 4, }}, {212, 4, {2, 4, 6, 7, 0, 0, 0, 0, }, {6, 4, 2, 7, 4, 4, 4, 4, }}, {213, 5, {0, 2, 4, 6, 7, 0, 0, 0, }, {4, 6, 0, 2, 7, 4, 4, 4, }}, {214, 5, {1, 2, 4, 6, 7, 0, 0, 0, }, {1, 6, 4, 2, 7, 4, 4, 4, }}, {215, 6, {0, 1, 2, 4, 6, 7, 0, 0, }, {4, 1, 6, 0, 2, 7, 4, 4, }}, {216, 4, {3, 4, 6, 7, 0, 0, 0, 0, }, {7, 4, 6, 3, 4, 4, 4, 4, }}, {217, 5, {0, 3, 4, 6, 7, 0, 0, 0, }, {4, 7, 0, 6, 3, 4, 4, 4, }}, {218, 5, {1, 3, 4, 6, 7, 0, 0, 0, }, {1, 7, 4, 6, 3, 4, 4, 4, }}, {219, 6, {0, 1, 3, 4, 6, 7, 0, 0, }, {4, 1, 7, 0, 6, 3, 4, 4, }}, {220, 5, {2, 3, 4, 6, 7, 0, 0, 0, }, {6, 7, 4, 2, 3, 4, 4, 4, }}, {221, 6, {0, 2, 3, 4, 6, 7, 0, 0, }, {4, 6, 7, 0, 2, 3, 4, 4, }}, {222, 6, {1, 2, 3, 4, 6, 7, 0, 0, }, {1, 6, 7, 4, 2, 3, 4, 4, }}, {223, 7, {0, 1, 2, 3, 4, 6, 7, 0, }, {4, 1, 6, 7, 0, 2, 3, 4, }}, {224, 3, {5, 6, 7, 0, 0, 0, 0, 0, }, {7, 6, 5, 4, 4, 4, 4, 4, }}, {225, 4, {0, 5, 6, 7, 0, 0, 0, 0, }, {5, 0, 6, 7, 4, 4, 4, 4, }}, {226, 4, {1, 5, 6, 7, 0, 0, 0, 0, }, {5, 1, 6, 7, 4, 4, 4, 4, }}, {227, 5, {0, 1, 5, 6, 7, 0, 0, 0, }, {0, 5, 1, 6, 7, 4, 4, 4, }}, {228, 4, {2, 5, 6, 7, 0, 0, 0, 0, }, {6, 5, 2, 7, 4, 4, 4, 4, }}, {229, 5, {0, 2, 5, 6, 7, 0, 0, 0, }, {0, 6, 5, 2, 7, 4, 4, 4, }}, {230, 5, {1, 2, 5, 6, 7, 0, 0, 0, }, {5, 6, 1, 2, 7, 4, 4, 4, }}, {231, 6, {0, 1, 2, 5, 6, 7, 0, 0, }, {0, 5, 6, 1, 2, 7, 4, 4, }}, {232, 4, {3, 5, 6, 7, 0, 0, 0, 0, }, {7, 5, 6, 3, 4, 4, 4, 4, }}, {233, 5, {0, 3, 5, 6, 7, 0, 0, 0, }, {0, 7, 5, 6, 3, 4, 4, 4, }}, {234, 5, {1, 3, 5, 6, 7, 0, 0, 0, }, {5, 7, 1, 6, 3, 4, 4, 4, }}, {235, 6, {0, 1, 3, 5, 6, 7, 0, 0, }, {0, 5, 7, 1, 6, 3, 4, 4, }}, {236, 5, {2, 3, 5, 6, 7, 0, 0, 0, }, {6, 7, 5, 2, 3, 4, 4, 4, }}, {237, 6, {0, 2, 3, 5, 6, 7, 0, 0, }, {0, 6, 7, 5, 2, 3, 4, 4, }}, {238, 6, {1, 2, 3, 5, 6, 7, 0, 0, }, {5, 6, 7, 1, 2, 3, 4, 4, }}, {239, 7, {0, 1, 2, 3, 5, 6, 7, 0, }, {0, 5, 6, 7, 1, 2, 3, 4, }}, {240, 4, {4, 5, 6, 7, 0, 0, 0, 0, }, {7, 5, 6, 4, 4, 4, 4, 4, }}, {241, 5, {0, 4, 5, 6, 7, 0, 0, 0, }, {4, 0, 5, 6, 7, 4, 4, 4, }}, {242, 5, {1, 4, 5, 6, 7, 0, 0, 0, }, {5, 4, 1, 6, 7, 4, 4, 4, }}, {243, 6, {0, 1, 4, 5, 6, 7, 0, 0, }, {4, 5, 0, 1, 6, 7, 4, 4, }}, {244, 5, {2, 4, 5, 6, 7, 0, 0, 0, }, {6, 4, 5, 2, 7, 4, 4, 4, }}, {245, 6, {0, 2, 4, 5, 6, 7, 0, 0, }, {4, 6, 0, 5, 2, 7, 4, 4, }}, {246, 6, {1, 2, 4, 5, 6, 7, 0, 0, }, {5, 6, 4, 1, 2, 7, 4, 4, }}, {247, 7, {0, 1, 2, 4, 5, 6, 7, 0, }, {4, 5, 6, 0, 1, 2, 7, 4, }}, {248, 5, {3, 4, 5, 6, 7, 0, 0, 0, }, {7, 4, 5, 6, 3, 4, 4, 4, }}, {249, 6, {0, 3, 4, 5, 6, 7, 0, 0, }, {4, 7, 0, 5, 6, 3, 4, 4, }}, {250, 6, {1, 3, 4, 5, 6, 7, 0, 0, }, {5, 7, 4, 1, 6, 3, 4, 4, }}, {251, 7, {0, 1, 3, 4, 5, 6, 7, 0, }, {4, 5, 7, 0, 1, 6, 3, 4, }}, {252, 6, {2, 3, 4, 5, 6, 7, 0, 0, }, {6, 7, 4, 5, 2, 3, 4, 4, }}, {253, 7, {0, 2, 3, 4, 5, 6, 7, 0, }, {4, 6, 7, 0, 5, 2, 3, 4, }}, {254, 7, {1, 2, 3, 4, 5, 6, 7, 0, }, {5, 6, 7, 4, 1, 2, 3, 4, }}, {255, 8, {0, 1, 2, 3, 4, 5, 6, 7, }, {4, 5, 6, 7, 0, 1, 2, 3, }}, }; #define BS 192 #define BSS 160 #define BSC 224 //時刻 t から時刻 t-1 にさかのぼる __device__ char crashFD[1]; void *crashFD_p; __global__ void step_back(int t){ int i, j; char crash_n = 0; //時刻 t-1 のときに (x,y) で衝突していた粒子の個数 int pat = 0; //相対位置 k の粒子が時刻 t-1 で(x,y)にいたとき k 番目のビットが 1 になる int x, y, adx, ady; int line = blockIdx.x * blockDim.x + threadIdx.x; x = line / MAXN; y = line - x * MAXN; if(x >= MAXN || y >= MAXN) return; //各隣接格子点に対して for(i = 0; i < 8; i++){ adx = adjxD[x][i]; ady = adjyD[y][i]; //隣接したマスに時刻 t-1 のとき(x,y)だった粒子が存在しないかみる for(j = 0; j < univ_nD[IDXN3(t,adx,ady,MAXN)]; j++){ //粒子を発見したとき if(i == univ_vD[IDXN4(t,adx,ady,j,MAXN)]){ pat = BIT(pat,i); univ_cD[IDXN4(t+1,x,y,crash_n,MAXN)] univ_cD[IDXN4(t,adx,ady,j,MAXN)]; crash_n++; break; } } } univ_nD[IDXN3(t+1,x,y,MAXN)] = crash_n; //crash_v を変換して univ_v[t-1][x][y] に代入していく処理↓ for(i = 0; i < crash_n; i++){ univ_vD[IDXN4(t+1,x,y,i,MAXN)] = new_transition_rulesD[pat].next[i]; } //2 つ以上の粒子が衝突したとき if(2 <= crash_n){ crashFD[0] = 1; } } __device__ char sameD[1]; void *sameD_p; __global__ void check_sub(int t, int k){ int x, y; int line = blockIdx.x * blockDim.x + threadIdx.x; x = line / MAXN; y = line - x * MAXN; if(x >= MAXN || y >= MAXN) return; if(univ_nD[IDXN3(t,x,y,MAXN)] == 1 && (univA_vD[IDXN_UA(k,x,y,MAXN)] != univ_vD[IDXN4(t,x,y,0,MAXN)] || univA_cD[IDXN_UA(k,x,y,MAXN)] != univ_cD[IDXN4(t,x,y,0,MAXN)])){ sameD[0] = 1; } } int check(int t, int k){ char same = 0; cudaMemcpy(sameD_p, &same, sizeof(char), cudaMemcpyHostToDevice); check_sub<<<(N*N+BSC-1)/BSC, BSC>>>(t, k); cudaMemcpy(&same, sameD_p, sizeof(char), cudaMemcpyDeviceToHost); return same; } __global__ void initB(int univ){ int i = blockIdx.x * blockDim.x + threadIdx.x; if(i >= 3 * MAXM) return; int x, y; x = BD[univ][i].x; y = BD[univ][i].y; univ_vD[IDXN4(0,x,y,0,MAXN)] = (char)BD[univ][i].dir; univ_cD[IDXN4(0,x,y,0,MAXN)] = (char)BD[univ][i].color; univ_nD[IDXN3(0,x,y,MAXN)] = 1; } /********* 各自のプログラムはここまで **********/ /********* テンプレート用 (2) ここから再開 **********/ int main() { struct timeval tstart, tlast; input(); gettimeofday(&tstart, NULL); printf("[TEMPLATE] ...end of input...\n"); fflush(stdout); /********* テンプレート用 (2) ここまで **********/ /********* 以下に各自のプログラムを書く **********/ { int i, k, t; int univ; char a_det[MAXK]; void *univ_n_p; void *univA_v_p; void *univA_c_p; //init cudaDeviceSynchronize(); cudaDeviceSetCacheConfig(cudaFuncCachePreferL1); memset(a_det, 0, sizeof(char) * K); cudaGetSymbolAddress(&sameD_p, sameD); cudaGetSymbolAddress(&crashFD_p, crashFD); cudaGetSymbolAddress(&univ_n_p, univ_nD); cudaGetSymbolAddress(&univA_v_p, univA_vD); cudaGetSymbolAddress(&univA_c_p, univA_cD); cudaGetSymbolAddress(&BD_p, BD); cudaGetSymbolAddress(&adjxD_p, adjxD); cudaGetSymbolAddress(&adjyD_p, adjyD); cudaMemcpy(BD_p, B, sizeof(Star) * MAXL * 3 * MAXM, cudaMemcpyHostToDevice); //隣接点を事前に計算しておく for(i = 0; i < MAXN; i++){ for(k = 0; k < 8; k++){ int adx = i + dx[k]; int ady = i + dy[k]; if(adx == MAXN) adx = 0; if(adx == -1) adx = MAXN - 1; if(ady == MAXN) ady = 0; if(ady == -1) ady = MAXN - 1; adjx[i][k] = adx; adjy[i][k] = ady; } } cudaMemcpy(adjxD_p, adjx, sizeof(int) * MAXN * 8, cudaMemcpyHostToDevice); cudaMemcpy(adjyD_p, adjy, sizeof(int) * MAXN * 8, cudaMemcpyHostToDevice); //宇宙 A のコピー for(univ = 0; univ < K; univ++){ for(i = 0; i < 3 * M; i++){ int x, y, dir, col; x = A[univ][i].x; y = A[univ][i].y; dir = (char)A[univ][i].dir; col = (char)A[univ][i].color; univA_v[IDXN_UA(univ,x,y,MAXN)] = dir; univA_c[IDXN_UA(univ,x,y,MAXN)] = col; } } cudaMemcpy(univA_v_p, univA_v, sizeof(char) * MAXK * MAXN * MAXN, univA_c, sizeof(char) * MAXK * MAXN * MAXN, cudaMemcpyHostToDevice); cudaMemcpy(univA_c_p, cudaMemcpyHostToDevice); for(univ = 0; univ < L; univ++){ //宇宙 B をひとつずつみていく memset(univ_n, 0, sizeof(char) * MAXN * MAXN); cudaMemcpy(univ_n_p, univ_n, sizeof(char)*MAXN*MAXN, cudaMemcpyHostToDevice); initB<<<(3*M+BS-1)/BS, BS>>>(univ); for(t = 0; t < T * 2; t++){ int crashF = 0; if(t + 1 > T / 2) cudaMemcpy(crashFD_p, &crashF, sizeof(char),sizeof(char), cudaMemcpyHostToDevice); step_back<<<(N*N+BSS-1)/BSS, BSS>>>(t); if(t + 1 > T / 2) cudaMemcpy(&crashF, crashFD_p, sizeof(char), cudaMemcpyDeviceToHost); if(t + 1 > T / 2 && crashF == 0){ for(i = 0; i < K; i++){ if(a_det[i] == 1) continue; if(check(t+1, i) == 0){ //等しいならば 0 異なれば 1 answer[univ] = i; a_det[i] = 1; goto end; } } } } end: ; } } /********* 各自のプログラムはここまで **********/ /********* テンプレート用 (3) ここから再開,最後まで **********/ gettimeofday(&tlast, NULL); fflush(stdout); printf("[TEMPLATE] time %lf seconds\n", (double)(tlast.tv_sec - tstart.tv_sec)+ (double)(tlast.tv_usec - tstart.tv_usec)/ 1000000); output(); printf("[TEMPLATE] end of execution\n"); return 0; }