谐锴参加一个宝箱旋转游戏,给定一个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");
}
}
}