ページ 11

さいころを転がす問題なのですが

Posted: 2015年6月24日(水) 20:17
by きょう
目が4,5,6の方向にしか転がらなくて、高さがないといけないです。
自分が考えた解放は、まず回転に関係ない頂点、底を固定し、二次元配列を作ります。
質問したい、わからないところは段差の表し方です。
上から落ちてきて、どこか底についたら、底は+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;
}

Re: さいころを転がす問題なのですが

Posted: 2015年6月25日(木) 17:47
by usao

コード:

//場所ごとにサイコロが何個積みあがってるのかを記録するバッファ.
//最初は全て0に初期化しておき,サイコロの到達地点の値をインクリメント.
unsigned char HeightField[101][101];  //101x101くらいあればいいのだろうか?
みたいなのを素直に用意するのではダメなのでしょうか.