#include
int 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が入っている場所
あなたの負け!

図解