生活随笔
收集整理的這篇文章主要介紹了
NYOJ 598 旋转圆柱矩阵
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
旋轉圓柱矩陣
時間限制:
1000?ms ?|? 內存限制:
65535?KB 難度:
3
描述
將圓柱體的側面展開能得到一個m*n的矩形。這是姑且看成一個01矩陣, 我們需要通過特定的移動得到另一個矩陣(該矩陣其中任意的某一列全部為1),每一次只能移動一行,且只能移動一位,可以向左移動,也可以向右移動,求最小的移動步數(shù),如不能通過移動得到結果,則輸出“-1”。 例如: 3*5的矩陣 00001 10000 00001 我們只需要將第二行向左移動一位即可得到所求。 輸入第一行一個整數(shù)N(N<=10),表示測試數(shù)據(jù)的組數(shù)。
第二行兩個整數(shù)m n( 1 <= n , m <= 200),表示矩陣的行數(shù)和列數(shù)。
接下來m行,其中每一行n個數(shù)字。輸出如果該矩陣可以移動得到結果,則每行一個數(shù)字,表示最小的移動步數(shù)。
否則輸出-1。樣例輸入 2
3 5
00001
10000
00001
3 4
0001
0100
0001
樣例輸出 1
2 AC碼: #include<stdio.h>
#include<string.h>
int num[205][205],sum[205];
int main()
{int T,n,m,a,b,i,j,min,flag;char str[205];scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);for(i=0;i<n;i++){scanf("%s",str);flag=0;for(j=0;str[j]!='\0';j++){num[i][j]=str[j]-'0';if(num[i][j]==1)flag=1;}}if(flag==0){printf("-1\n");continue;}memset(sum,0,sizeof(sum));for(i=0;i<n;i++){for(j=0;j<m;j++){if(num[i][j]==0){a=j;b=j;while((num[i][a]==0)&&(num[i][b]==0)){a=(a+m-1)%m;b=(b+m+1)%m;sum[j]++;}}}}min=999999999;for(i=0;i<m;i++){if(min>sum[i])min=sum[i];}printf("%d\n",min);}return 0;
}
總結
以上是生活随笔為你收集整理的NYOJ 598 旋转圆柱矩阵的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。