#include"stdio.h"
int main()
{
int a[10][10],b[10];
int m,n,i,j,k,t,count;
scanf("%d%d",&m,&n);
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
}
for(i=0;i<m;i++)
{
count=0;
for(j=0;j<n;j++)
{
if(a[i][j]==1)
count++;
}
if(count!=n)
{
for(k=0;k<m;k++)
{
b[k]=i;
}
}
}
for(i=0;i<m-k;i++)
{
for(j=0;j<n;j++)
{
a[i][j]=0;
}
}
for(i=m-k-1;i<m;i++)
{
for(t=0;t<k;t++)
{
for(j=0;j<n;j++)
{
a[i][j]=a[b[t]][j];
}
}
}
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
printf("%2d",a[i][j]);
}
printf("\n");
}
}
帮你稍微改了一下
#include "stdio.h"
int main()
{
int a[10][10];
int m, n, i, j, t, s, count,cnt = 0;
scanf("%d%d", &m, &n);
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
scanf("%d", &a[i][j]);
}
}
printf("\n");
for (i = m - 1; i >= 0; i--)
{
count = 0;
cnt ++;//记录遍历的行数
if(cnt > m) break;//如果当前遍历过的行数>m说明全部遍历过了,退出循环
for (j = 0; j < n; j++)
{
if (a[i][j] == 1)
count++;
}
if (count == n)
{ //删
if (i == 0)
{ //删第一行
for (t = 0; t < n; t++)
{
a[i][t] = 0;
}
break;
}
for (s = i; s > 0; s--)
{
for (t = 0; t < n; t++)
{
a[s][t] = a[s - 1][t];
}
}
for (t = 0; t < n; t++)
{ //第一行补0
a[0][t] = 0;
}
i ++;//由于下降了一行,这里的i加一重新遍历这一行
}
}
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
printf("%d ", a[i][j]);
}
printf("\n");
}
}