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