1 条题解

  • 0
    @ 2023-10-18 16:27:55

    C++ :

    #include<bits/stdc++.h>
    using namespace std;
    const int N=400;
    char mp[N][N];
    //这个题的核心就是坐标转换
    //我们选择左下角作为基准点
    //int x=399-2*(n-i)-3*(k-1);
    //         行的贡献  高度贡献 
    //int y=2*(n-i)+4*(j-1);
    //        行的贡献 列的贡献 
    char box[10][10]={ //一个立体箱子
    	"..+---+",
    	"./   /|",
    	"+---+ |",
    	"|   | +",
    	"|   |/.",
    	"+---+..", 
    };
    int h[N][N];
    int main()
    {
    	int n,m;
    	cin>>n>>m;
    	for(int i=1;i<=n;i++) //获取高度
    	{
    		for(int j=1;j<=m;j++)
    		{
    			cin>>h[i][j];
    		}
    	}
    	for(int i=0;i<N;i++) //初始化为空
    	{
    		for(int j=0;j<N;j++)
    		{
    			mp[i][j]='.';
    		}
    	}
    	int up=N-1,right=0; //最上和最右边
    	for(int i=1;i<=n;i++)
    	{
    		for(int j=1;j<=m;j++)
    		{
    			for(int k=1;k<=h[i][j];k++)
    			{
    				int x=399-2*(n-i)-3*(k-1); //计算当前这个箱子在的行
    				int y=2*(n-i)+4*(j-1); //计算当前箱子在的列
    				up=min(up,x-5); //
    				right=max(right,y+6);
    				for(int a=0;a<6;a++)  //将箱子放入当前位置
    				{
    					for(int b=0;b<7;b++)
    					{
    						if(box[a][b]!='.')
    						{
    							mp[x-5+a][y+b]=box[a][b];
    						}
    					}
    				}
    			}
    		}
    	}
    	for(int i=up;i<N;i++) //输出
    	{
    		for(int j=0;j<=right;j++)
    		{
    			cout<<mp[i][j];
    		}
    		cout<<endl;
    	}
    	return 0;
    }
    
    
    • 1

    信息

    ID
    812
    时间
    1000ms
    内存
    128MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者