1 条题解

  • 0
    @ 2025-8-24 21:34:59

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Diaоsi
    Enemy of God

    搬运于2025-08-24 21:34:58,当前版本为作者最后更新于2019-08-15 14:23:10,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    带模拟题

    好吧言归正传,由样例可知是顺时针旋转

    观察下面两个卡片

    ###O# #####
    ##### #####
    ##### #####
    ##### ####0
    ##### #####
    

    设原坐标为(x,y)

    不难发现旋转90度后坐标可以表示为(y,len-x)

    len为卡片的边长+1

    于是我们可以用一个函数去处理旋转的过程

    旋转函数:

    void turn(){
    	for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                TEMP[i][j]=0;//初始化
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=n;j++)
    			if(P[i][j])TEMP[j][len-i]=1;//临时存放
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=n;j++)
    			P[i][j]=TEMP[i][j];//转移
    }
    

    在这个函数中,我使用了一个bool数组P去储存卡片的状态(0为'#',1为'O')

    同时使用一个临时矩阵(TEMP)去记录旋转后的卡片,目的是防止重复操作

    最后再将结果存入原始的矩阵P中

    遍历操作:

    for(int i=1;i<=n;i++)
    		for(int j=1;j<=n;j++)
    			if(P[i][j])ans[cnt++]=s[i][j];
    

    在主函数中每旋转一次就将文字卡片遍历一次

    s[N][N]为文本卡片

    对于结果,我们可以使用一个字符数组ans[N]和计数器cnt来存储

    cnt初始化为0

    完整代码奉上:

    #include<bits/stdc++.h>
    using namespace std;
    const int N=10010,M=1000010;
    bool P[N][N],TEMP[N][N];
    char s[N][N],ans[M];
    int n,cnt,len;
    void turn(){
    	for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                TEMP[i][j]=0;
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=n;j++)
    			if(P[i][j])TEMP[j][len-i]=1;
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=n;j++)
    			P[i][j]=TEMP[i][j];
    }
    int main(){
    	cin>>n;len=n+1;
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=n;j++){
    			char a;
    			cin>>a;
    			if(a=='O')P[i][j]=1;
    		}
    	}
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=n;j++)
    			cin>>s[i][j];
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=n;j++)
    			if(P[i][j])ans[cnt++]=s[i][j];
    	turn();
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=n;j++)
    			if(P[i][j])ans[cnt++]=s[i][j];
    	turn();
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=n;j++)
    			if(P[i][j])ans[cnt++]=s[i][j];
    	turn();
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=n;j++)
    			if(P[i][j])ans[cnt++]=s[i][j];
    	for(int i=0;i<=cnt;i++)cout<<ans[i];
    	return 0;
    }
    

    如有错误请在评论区指出

    • 1

    信息

    ID
    1168
    时间
    1000ms
    内存
    125MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者