こんにちは、

fuku です、皆さんいかが

お過ごしでしょうか。


昨日は、暖かかったですね。

今日は 一転、雪が 降っています。

カラフルな 天気なので、

体調には くれぐれも お気をつけ下さい。


ところで。

又、プログラムを

作成しました。^^


〈 裏返しゲーム。〉

3桁の 2進数 数字を

入力し、

パターンに 合わせて

変換、全部 0 0 0

又は、1 1 1 にするという、

手順を 示す PG です。

( 1 を表、 0 を裏と 仮定しました )


パターンが 見つかれば、

found = 1

となり、場所を

i

で、表します。

今回は、パターンは

1 0

で、設定しています。

見つかったら、

0 1

に 変換、

続きの 数字を

変換して、

全部 同じ 数字にします。

( 最短 1手、最長 2手で
出来るみたいです )


参考図書
基本情報技術者予想問題集 [ アイテック ]
 文字列の探索… p588


… (人工知能入門)
p21
3枚の コインの パズル

〈 裏表のある コインが3枚、一列に並んでいます。
今、隣り合う2枚のコインを 同時に裏がえす操作だけで、
ある並び方の コインを 全て 表または裏にする方法を 示してください。〉


ちょっと、コードが

冗長ですが、

もしあれでしたら、

改善してみてください。;)

( バグなど ありましたら、

ご連絡下さい )




#include <stdio.h>
#include <string.h>

int i;
int j;
int found;
int n,m;
int x;

char T[4];
char P1[3];

char TS[4];
char PS[4];
char S0[2] = "0";
char S1[2] = "1";

char TK[2];

int ptn();

void hant(int y){
TK[0] = T[2];
if((y == 0) && (strcmp(TK, S0)==0)){
TS[0] = T[0];
TS[1] = S1[0];
TS[2] = S1[0];
printf("Text = %s\n", TS);}

   if((y==0) && (strcmp(TK, S1)==0)){
   TS[0] = S0[0];
   TS[1] = S1[0];
   TS[2] = TK[0];
   printf("Text = %s\n", TS);
   TS[0] = S0[0];
   TS[1] = S0[0];
   TS[2] = S0[0];
   printf("Text = %s\n", TS);}

TK[0] = T[0];
if((y == 1) && (strcmp(TK, S1)==0)){
TS[0] = S0[0];
TS[1] = S0[0];
TS[2] = T[2];
printf("Text = %s\n", TS);}

   if((y==1) && (strcmp(TK, S0)==0)){
   TS[0] = TK[0];
   TS[1] = S0[0];
   TS[2] = S1[0];
   printf("Text = %s\n", TS);
   TS[0] = S1[0];
   TS[1] = S1[0];
   printf("Text = %s\n", TS);}

}

int main(){

strcpy(P1, "10");

scanf("%s", T);
int x = ptn();
printf("i = %d\n", x);
hant(x);

}


ptn(){

i = 0;
found = -1;
n = 2;
m = 1;

while((found == -1) && (i <= (n - m + 1))){
   j = 0;
   PS[0] = P1[j];
   TS[0] = T[i+j];
    while((j <= m) && (strcmp(TS, PS) == 0)){
    j = j + 1;
   PS[0] = P1[j];
   TS[0] = T[i+j];}

   if( j > m ){
   found = 1;}
 else{
   i = i + 1;
  TS[0] = T[i];}
}


if( found == -1 ){
   i = -1;}

printf("found = %d\n", found);
return i;

}