さいころを転がす問題なのですが
Posted: 2015年6月24日(水) 20:17
目が4,5,6の方向にしか転がらなくて、高さがないといけないです。
自分が考えた解放は、まず回転に関係ない頂点、底を固定し、二次元配列を作ります。
質問したい、わからないところは段差の表し方です。
上から落ちてきて、どこか底についたら、底は+1の段差が生まれ、落ちてきたところは段差が減ります。
これをどうコードにすればよいのかわからず、苦戦しております。
お力を貸していただけないでしょうか。
問題文です:http://judge.u-aizu.ac.jp/onlinejudge/d ... 81&lang=jp
コードです
自分が考えた解放は、まず回転に関係ない頂点、底を固定し、二次元配列を作ります。
質問したい、わからないところは段差の表し方です。
上から落ちてきて、どこか底についたら、底は+1の段差が生まれ、落ちてきたところは段差が減ります。
これをどうコードにすればよいのかわからず、苦戦しております。
お力を貸していただけないでしょうか。
問題文です:http://judge.u-aizu.ac.jp/onlinejudge/d ... 81&lang=jp
コードです
#include<iostream>
#include<vector>
using namespace std;
int dice[24][6]={//トップ、フロント、バック、左、右、下
{1,2,5,4,3,6},
{1,3,4,5,2,6},
{1,4,3,5,2,6},
{1,5,2,3,4,6},
{2,1,6,3,4,5},
{2,3,4,6,1,5},
{2,4,3,1,6,5},
{2,6,1,4,3,5},
{3,1,6,2,5,4},
{3,2,5,6,1,4},
{3,5,2,1,6,4},
{3,6,1,5,2,4},
{4,1,6,5,2,3},
{4,2,5,1,6,3},
{4,5,2,6,1,3},
{4,6,1,2,5,3},
{5,1,6,3,4,2},
{5,3,4,6,1,2},
{5,4,3,1,6,2},
{5,6,1,3,4,2},
{6,2,5,4,3,1},
{6,3,4,2,5,1},
{6,4,3,5,2,1},
{6,5,2,3,4,1},
};
int t,f;
int n;
int h;
vector<int> suuzi[100][100];//三次元配列で、サイズが高さを表します。
int dy[]={0,1,-1,0,0,0};
int dx[]={0,0,0,-1,1,0};
void func(int top,int front,int y,int x,int h)
{
cout<<h<<endl;
if(h==1)
{
//maze[y][x]=true;
suuzi[y][x].push_back(top);
suuzi[50][50].pop_back();
return;
}
for(int i=0;i<24;i++)
{
if(dice[i][0]==top&&dice[i][1]==front)
{
for(int j=1;j<5;j++)
{
int nx=dx[j]+x;
int ny=dy[j]+y;
if(dice[i][j]==6&&h-suuzi[ny][nx].size()>0)
{
return func(1,dice[i][0],ny,nx,suuzi[ny][nx].size()+1);
}
}
for(int j=1;j<5;j++)
{
int nx=dx[j]+x;
int ny=dy[j]+y;
if(dice[i][j]==5&&h-suuzi[ny][nx].size()>0)
{
return func(2,dice[i][0],ny,nx,suuzi[ny][nx].size()+1);
}
}
for(int j=1;j<5;j++)
{
int nx=dx[j]+x;
int ny=dy[j]+y;
if(dice[i][j]==4&&h-suuzi[ny][nx].size()>0)
{
return func(3,dice[i][0],ny,nx,suuzi[ny][nx].size()+1);
}
}
}
}
suuzi[y][x].push_back(top);
return;
}
int main()
{
while(cin>>n,n)
{
//h=0;
for(int i=0;i<100;i++)
{
for(int j=0;j<100;j++)
{
suuzi[i][j].clear();
}
}
cin>>t>>f;
suuzi[50][50].push_back(t);
for(int i=0;i<n-1;i++)
{
cin>>t>>f;
suuzi[50][50].push_back(t);
func(t,f,50,50,suuzi[50][50].size());
for(int j=45;j<55;j++)//毎回の動作を見ています。今回は、高さのみを見ています。
{
for(int k=45;k<55;k++)
{
cout<<suuzi[j][k].size();
}
cout<<endl;
}
}
int a=0;
int b=0;
int c=0;
int d=0;
int e=0;
int f=0;
for(int i=0;i<100;i++)
{
for(int j=0;j<100;j++)
{
if(suuzi[i][j].size()!=0)
{
if(suuzi[i][j][suuzi[i][j].size()-1]==1)a++;
if(suuzi[i][j][suuzi[i][j].size()-1]==2)b++;
if(suuzi[i][j][suuzi[i][j].size()-1]==3)c++;
if(suuzi[i][j][suuzi[i][j].size()-1]==4)d++;
if(suuzi[i][j][suuzi[i][j].size()-1]==5)e++;
if(suuzi[i][j][suuzi[i][j].size()-1]==6)f++;
}
}
}
cout<<"ans"<<a<<" "<<b<<" "<<c<<" "<<d<<" "<<e<<" "<<f<<endl;
}
return 0;
}