[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[nikomat:22428] Re: 返信:[Game]ana



ひうら@きょうだいっす。

さっき息抜き?に general version 作ったら、
こんなのが来た・・・急に改造。

再帰プログラムの教材にいかが?

#バグってたら、ごめんなさい。

> ひうら[22421]さん:
> > 乾さんのすばやさもさる事ながら、出題者、丹後屋さんの
> > 問題の良さもさすが。
> 誉められついでに悪乗り
> 
>    NIKON
>  x    F2
> ----------
>   WELOVE
> 
> '2' はそのまま 2 です。
> アルファベットの意味は前回と同じ。但し、どの文字も2と異なるとします。

E = 6, F = 1, I = 9, K = 0, L = 8, N = 3, O = 2, V = 7, W = 4, 
E = 2, F = 1, I = 0, K = 4, L = 5, N = 6, O = 8, V = 3, W = 7, 
E = 2, F = 0, I = 4, K = 3, L = 8, N = 6, O = 7, V = 5, W = 1, 
E = 2, F = 0, I = 4, K = 8, L = 9, N = 6, O = 7, V = 5, W = 1, 
E = 6, F = 1, I = 0, K = 4, L = 5, N = 8, O = 7, V = 3, W = 9, 
E = 6, F = 0, I = 2, K = 3, L = 4, N = 8, O = 7, V = 5, W = 1, 
E = 6, F = 0, I = 2, K = 7, L = 5, N = 8, O = 4, V = 9, W = 1, 
E = 8, F = 0, I = 2, K = 3, L = 4, N = 9, O = 7, V = 5, W = 1, 
E = 8, F = 0, I = 3, K = 6, L = 7, N = 9, O = 2, V = 5, W = 1, 

の9通り。
検算はしてませんが・・

---- ---- ----
#include <stdio.h>

int buf[10];
int index[26];
/* char *txt[3] = {"NIKON", "F", "ILIKE"}; */

char *txt[3] = {"NIKON", "F2", "WELOVE"};

void check();
void loop(int pos, int end);

main() {
  int i, j, ind;
  int minBuf = 0;

  for(i = 0; i < 26; i++) {
    index[i] = -1;
  }

  for(j = 0; j < 3; j++) {
    char *str = txt[j];

    for(i = 0; str[i] != '\0'; i++) {
      ind = str[i] - 'A';
      
      if(str[i] <  'A' || 'Z' < str[i]) {
	continue;
      }
      if(index[ind] != -1) {
	continue;
      }
      index[ind] = minBuf;
      minBuf++;
    }
  }
  printf("number of characters = %d\n", minBuf);

  loop(0, minBuf - 1);
}

void loop(int pos, int end) {
  int i, j;

  for(i = 0; i <= 9; i++) {
    buf[pos] = i;

    for(j = 0; j < pos; j++) {
      if(buf[j] == i) {
	goto CONT;
      }
    }
    if(pos == end) {
      check();
    }
    else {
      loop(pos+1, end);
    }
  CONT:
    ;
  }
}

void check() {
  int i, j;
  int val[3];
  char *str;

  for(j = 0; j < 3; j++) {
    val[j] = 0;
    str = txt[j];

    for(i = 0; str[i] != '\0'; i++) {
      if('0' <= str[i] && str[i] <= '9') {
	val[j] = val[j] * 10 + str[i] - '0';
      }
      else {
	val[j] = val[j] * 10 + buf[index[str[i] - 'A']];
      }
    }
  }
  if(val[0] * val[1] == val[2]) {
    for(i = 0; i < 26; i++) {
      if(index[i] != -1) {
	printf("%c = %d, ", i+'A', buf[index[i]]);
      }
    }
    printf("\n");
  }
}