主に開発したプログラムの話や、プログラミングの話をしていくブログです。 時々は、他の創作物の話も。
↓自力で組んだEnclosure関数。modeが当該ページ上のnね。
/* Enclosure(number, mode) */
/* 場合分けせず、modeの値に応じて動的に処理する */
int Enclosure(int number[][NUM_MAX], int mode){
int flg = 0, temp[NUM_MAX], *pos, i, j, k, sum, chk, tmp;
pos = (int *)malloc(sizeof(int) * mode);
for(k = 0; k < mode; k++)
pos[k] = k;
while(1){
/* OR操作 */
for(k = 0; k < NUM_MAX; k++)
temp[k] = number[pos[0]][k];
for(i = 0; i < NUM_MAX; i++){
for(j = 1; j < mode; j++)
temp[i] |= number[pos[j]][i];
}
/* 候補数字数を数える */
sum = 0;
for(k = 0; k < NUM_MAX; k++)
sum += temp[k];
/* 分岐 */
if(sum < mode){
/* 解なし */
return -1;
}else{
if(sum == mode){
/* 反映 */
for(i = 0; i < NUM_MAX; i++){
chk = 0;
for(k = 0; k < mode; k++){
if(pos[k] == i){
chk = 1;
break;
}
}
if(chk == 0){
for(k = 0; k < NUM_MAX; k++){
if((temp[k] == 1) && (number[i][k] == 1)){
number[i][k] = 0;
if(flg == 0)
flg = 1;
}
}
}
}
}
}
/* 次の組み合わせへと移動 */
chk = 0;
for(i = mode - 1; i > -1; i--){
if(pos[i] == i - mode + NUM_MAX){
if(i == 0){
chk = 1;
break;
}
continue;
}
tmp = pos[i] + 1;
for(j = i; j < mode; j++){
pos[j] = tmp;
tmp++;
}
break;
}
if(chk == 1)
break;
}
free(pos);
return flg;
}
Author:YSR
「YSR」「YSRKEN」「◆YSRKENkO6Y(~2013/08/25)」「◆YSRKEN.ceVZZ(2013/08/26~)」として活動しています。
プログラミングと艦これが趣味です。
プロフ画像はCrystalDiskInfoの水晶雫ちゃんです。
主な創作物についてはhttp://ysrken.blog.fc2.com/blog-entry-76.htmlをご覧ください。
日 | 月 | 火 | 水 | 木 | 金 | 土 |
---|---|---|---|---|---|---|
- | - | - | - | - | 1 | 2 |
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | - | - |
コメントの投稿