下図のようなあみだくじがあります。縦線5本、横線4本です。横線は縦線をまたいでも良い物とします。
上の図の横線情報を
1,2
のようにカンマ区切りで表す。この情報を元にして、1,2,3,4...がどのような順番になるのかを出力するプログラムを作成する。なお、入力データはカレントフォルダの014.datに入っているものとする。
縦線の本数 w (整数 : w≦30)
横線の本数 n (整数 : n≦30)
横棒リスト a1,b1 (整数 : 半角カンマ区切り)
横棒リスト a2,b2 (整数 : 半角カンマ区切り)
...
...
横棒リスト an,bn (整数 : 半角カンマ区切り)
左から
1番目の棒に来る数字
2番目の棒に来る数字
...
...
n番目の棒に来る数字
5
4
1,2
3,5
2,4
1,4
1
4
5
2
3
素直にたどります。
#include <stdio.h> int main(){ int w,n,i,nowLine; struct{ int a,b; }list[30]; FILE *fp; fp=fopen("014.dat","r"); fscanf(fp,"%d\n%d\n",&w,&n); for(i=0;i<n;i++){ fscanf(fp,"%d,%d\n",&(list[i].a),&(list[i].b)); } for(i=1;i<=w;i++){ int j; nowLine = i; //逆からたどる for(j=n-1;j>=0;j--){ //線をわたる if(list[j].a == nowLine){ nowLine = list[j].b; }else if(list[j].b == nowLine){ nowLine = list[j].a; } } printf("%d\n",nowLine); } return 0; }
この問題はただの処理問題なので、パパっと作ってしまいましょう。C言語では構造体を使っていますが、独立した変数でも構いません。むしろその方が素早くソースコードを書くことが出来ると思います。そのようなソースコードの書き方にもなれておく必要があるでしょう。