LeetCode双周赛第52场箱子旋转C语言改编题

谐锴参加一个宝箱旋转游戏,给定一个6*6的矩阵,它表示一个箱子的侧视图。箱子的每一个格子的状态可能如图 I 所不,铝球和面定的障碍物,将这个箱子逆时针旋转90*,转完后由于重力原因,部分篮球的位置会发生改变。每个篮球会垂直掉落,直到他遇到阻挡(固定的障碍物、另一个篮球或者箱子的底部)。重力不会影响固定障碍物的位置,同时箱子旋转不会产生惯性,也就是说篮球水平位置不会发生改变。

输入三个数字m,n和flag,并输入一个m*n的矩阵,输出旋转n次后的结果。
增加条件:障碍物最多承载3个篮球,多于3个则被破坏。

eg:未使用指针

#include<stdio.h>
int Overturn(int n,int m,int flag);

int main(){
	int n,m;//盒子长为n,宽为m 
	int flag1;//翻转次数 
	printf("请输入盒子的长和宽:"); 
	scanf("%d,%d",&n,&m);
	printf("请输入翻转的次数:");
	scanf("%d",&flag1); 
	Overturn(n,m,flag1);
} 
int Overturn(int n,int m,int flag1){
	int box[n][m];
	int flag2;
	printf("请按照从左往右的顺序输入:\n"); 
	for(int i=0;i<m;i++)
	   for(int j=0;j<n;j++)
	      scanf("%d",&box[i][j]);
	
	printf("翻转前盒子为:\n");
	for(int i=0;i<m;i++){
		for(int j=0;j<n;j++){
	   	printf("%d ",box[i][j]);
	   }
	    printf("\n"); 
	}

if(flag1%4==0){
	int res[n][m];
	for (int i=0;i<m; i++) {
        for (int j=0;j<n;j++) {
            res[i][j]=box[i][j];
        }
    }
    		for(int i=0;i<m;i++)
	   for(int j=n-1,k=n;j>=0;j--)
	   if(res[j][i]==2) 
			{int sum=0;
	      	for(int p=j;p>=0;p--){
	      	if(res[p][i]==1) 
			sum++;}	
			if(sum>3) res[j][i]=0;
	      	else k=j;        
		  }
	        else if(res[j][i]==1){
	      	res[j][i]=0;
	      	res[--k][i]=1;
}
	printf("翻转后盒子为:\n");
	
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
	   	printf("%d ",res[i][j]);
	   }
	    printf("\n"); 
	}
}
	
if(flag1%4==1){
	int res[m][n];
	for(int j=m-1,a=0;j>=0;j--,a++){
	   	for(int i=0,k=0;i<n;i++,k++){
	   		res[a][k]=box[i][j];
	       } 
		}
	for(int i=0;i<n;i++)
	   for(int j=m-1,k=m;j>=0;j--){
	   if(res[j][i]==2) 
			{int sum=0;
	      	for(int p=j;p>=0;p--){
	      	if(res[p][i]==1) 
			sum++;}	
			if(sum>3) res[j][i]=0;
	      	else k=j;        
		  }
	      else if(res[j][i]==1){
	      	res[j][i]=0;
	      	res[--k][i]=1;
	   }
	   	
}
	printf("翻转后盒子为:\n");
	
	for(int i=0;i<m;i++){
		for(int j=0;j<n;j++){
	   	printf("%d ",res[i][j]);
	   }
	    printf("\n"); 
	}
}

if(flag1%4==2){
	int res[n][m];
	for(int j=m-1,a=0;j>=0;j--,a++){
	   	for(int i=n-1,k=0;i>=0;i--,k++){
	   		res[a][k]=box[j][i];
	       } 
		}
			for(int i=0;i<m;i++)
	   for(int j=n-1,k=n;j>=0;j--)
	   if(res[j][i]==2) 
			{int sum=0;
	      	for(int p=j;p>=0;p--){
	      	if(res[p][i]==1) 
			sum++;}	
			if(sum>3) res[j][i]=0;
	      	else k=j;        
		  }
	      else if(res[j][i]==1){
	      	res[j][i]=0;
	      	res[--k][i]=1;
}   
	printf("翻转后盒子为:\n");
	
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
	   	printf("%d ",res[i][j]);
	   }
	    printf("\n"); 
	}
}

if(flag1%4==3){
	int res[m][n];
	for(int j=0,a=0;j<m;j++,a++){
	   	for(int i=n-1,k=0;i<n;i--,k++){
	   		res[a][k]=box[i][j];
	       } 
		}
		for(int i=0;i<n;i++)
	   for(int j=m-1,k=m;j>=0;j--)
	   if(res[j][i]==2) 
			{int sum=0;
	      	for(int p=j;p>=0;p--){
	      	if(res[p][i]==1) 
			sum++;}	
			if(sum>3) res[j][i]=0;
	      	else k=j;        
		  }
	      else if(res[j][i]==1){
	      	res[j][i]=0;
	      	res[--k][i]=1;
}
	printf("翻转后盒子为:\n");
	
	for(int i=0;i<m;i++){
		for(int j=0;j<n;j++){
	   	printf("%d ",res[i][j]);
	   }
	    printf("\n"); 
	}
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值