#includeint a[100], b[100][100], c[100][100][100]; int n, m, i, w, r, s, t, u, j, h, k; void clearData() { int i, w, r; for (i=0; i<100; i++){ a[i] = 0; for (w=0; w<100; w++){ b[i][w] = 0; for (r=0; r<100; r++){ c[i][w][r] = 0; } } } } void inputData() { int i, w, r; printf("頂点の数を入力!\n"); scanf("%d",&n); for (i=1; i<=n; i++){ a[i] = 1; } printf("一辺の両端の頂点の数字を入力!(番号の小さい順に)\n"); while(1) { scanf("%d %d",&i,&w); if (i != 0 && w != 0) /*i,wに0を入力すればループをぬける*/ { b[i][w] = 1; } else { break; } } printf("三角形を作る頂点の数字を入力!(番号の小さい順に)\n"); while(1) { scanf("%d %d %d",&i,&w,&r); if (i != 0 && w != 0 && r != 0) /*i,w,rに0を入力すればループをぬける*/ { c[i][w][r]=1; } else { break; } } } void printData() { int i, w, r; printf("今各配列a,b,cに値1が入っている場所\n"); for (i=0; i<100; i++) { if (a[i] == 1) { printf("a[%d]\n",i); } for (w=0; w<100; w++) { if (b[i][w] == 1) { printf("b[%d][%d]\n",i,w); } for (r=0; r<100; r++) { if (c[i][w][r] == 1) { printf("c[%d][%d][%d]\n",i,w,r); } } } } } int nonEmpty() { for (i=0; i<100; i++) { /*a,b,cの配列の各要素の値を調べるために,i,w,rでまわす*/ for (w=0; w<100; w++) { for (r=0; r<100; r++) { if((a[i] != 0) || (b[i][w] != 0) || (c[i][w][r] != 0)){ return 1; } } } } return 0; } main() { clearData(); inputData(); printData(); printf("交互に、一つの頂点、辺、三角形を消していけ\n"); /*配列a,b,cすべての要素の値が値が0になるまでwhile文で繰り返す。*/ while (nonEmpty()) { printf("what delete 1,頂点 2,辺 3,三角形\n"); scanf("%d",&k); if (k == 1) { printf("頂点を入力!\n"); scanf("%d",&j); a[j]=0; for (i=0 ;i<100; i++) { for (w=0; w<100; w++) { for (r=0; r<100; r++) { if ((j == i) || (j == w)) { b[i][w] = 0; } if ((j == i) || (j == w) ||(j == r)) { c[i][w][r] = 0; /*頂点を選ぶと,その選んだ頂点と,その頂点に接する辺,三角形が消える*/ } } } } } if (k == 2) { printf("辺の両端の頂点を入力!(番号の小さい順に)\n"); scanf("%d %d",&h,&m); b[h][m] = 0; for (i=0; i<100; i++) { for (w=0; w<100; w++) { for (r=0; r<100; r++) { if ( (h == i) || (h == w) || (h == r) || (m == i) || (m == w) || (m == r)) { c[i][w][r] = 0; /*辺を選ぶと,辺と,囲まれている三角形が消える*/ } } } } } if (k == 3) { printf("三個の頂点を入力!(番号の小さい順に)\n"); scanf("%d %d %d",&s,&t,&u); c[s][t][u] = 0; /*三角形を消すと,三角形のみが消える。*/ } printData(); } printf("あなたの負け!\n"); /*whileループが終り,配列a,b,cのすべての要素の値が0になったとき,次に消す頂点,辺,三角形は無くなるので,次の順番の人が負ける。*/ } -------------------------------------------------------------------
ccxtc122~/tokken@@@@@@@@@@@~%./a.out 頂点の数を入力! 3 一辺の両端の頂点の数字を入力!(番号の小さい順に) 1 2 2 3 1 3 0 0 三角形を作る頂点の数字を入力!(番号の小さい順に) 1 2 3 0 0 0 今各配列a,b,cに値1が入っている場所 a[1] b[1][2] c[1][2][3] b[1][3] a[2] b[2][3] a[3] 交互に、一つの頂点、辺、三角形を消していけ what delete 1,頂点 2,辺 3,三角形 1 頂点を入力! 1 今各配列a,b,cに値1が入っている場所 a[2] b[2][3] a[3] what delete 1,頂点 2,辺 3,三角形 2 辺の両端の頂点を入力!(番号の小さい順に) 2 3 今各配列a,b,cに値1が入っている場所 a[2] a[3] what delete 1,頂点 2,辺 3,三角形 1 頂点を入力! 2 今各配列a,b,cに値1が入っている場所 a[3] what delete 1,頂点 2,辺 3,三角形 1 頂点を入力! 3 今各配列a,b,cに値1が入っている場所 あなたの負け!
![]()