武汉科技大学ACM:1008: 零起点学算法64——回型矩阵

Problem Description

输出n*m的回型矩阵

Input

多组测试数据
每组输入2个整数 n和m(不大于20)  

Output

输出n*m的回型矩阵,要求左上角元素是1,(每个元素占2个位置,靠右) 

Sample Input

4 3

Sample Output

 1  2  3
10 11  4
 9 12  5
 8  7  6


  1 #include<iostream>
  2 #include<string.h>
  3 #include<iomanip>
  4 using namespace std;
  5 int main()
  6 {
  7     int m,n,i,j,k,lastX,lastY;
  8     while(cin>>m>>n)
  9     {        
 10         int **a=new int*[m];
 11         for(i=0;i<m;i++)
 12         {
 13             *(a+i)=new int[n];
 14             memset(a[i],0,n*sizeof(int));
 15         }
 16         i=0,j=0,k=0;
 17         int state=0;//0 为从左到右赋值,1为从上到下,2为从右到左,3为从下到上
 18         while(k<m*n)
 19         {//要赋值m*n次
 20             switch(state)
 21             {
 22             case 0:
 23                 for(;j<n;++j)
 24                 {
 25                     if(a[i][j]==0)
 26                     {
 27                         a[i][j]=k+1;
 28                         ++k;
 29                         lastX=i;
 30                         lastY=j;//记录下一次赋值开始位置
 31                     }
 32                 }
 33                 i=lastX+1;
 34                 j=lastY;
 35                 state=1;
 36                 break;
 37             case 1:
 38                 for(;i<m;++i)
 39                 {
 40                     if(a[i][j]==0)
 41                     {
 42                         a[i][j]=k+1;
 43                         ++k;
 44                         lastX=i;
 45                         lastY=j;
 46                     }
 47                 }
 48                 i=lastX;
 49                 j=lastY-1;
 50                 state=2;
 51                 break;
 52             case 2:
 53                 for(;j>=0;--j)
 54                 {
 55                     if(a[i][j]==0)
 56                     {
 57                         a[i][j]=k+1;
 58                         ++k;
 59                         lastX=i;
 60                         lastY=j;
 61                     }
 62                 }
 63                 i=lastX-1;
 64                 j=lastY;
 65                 state=3;
 66                 break;
 67             case 3:
 68                 for(;i>=0;--i)
 69                 {
 70                     if(a[i][j]==0)
 71                     {
 72                         a[i][j]=k+1;
 73                         ++k;
 74                         lastX=i;
 75                         lastY=j;
 76                     }
 77                 }
 78                 i=lastX;
 79                 j=lastY+1;
 80                 state=0;
 81                 break;
 82             default:
 83                 break;            
 84             }
 85             
 86         }
 87         
 88         for(i=0;i<m;i++)
 89         {
 90             for(j=0;j<n;j++)
 91                 if(j==0)
 92                 {
 93                     cout<<setw(2)<<a[i][j];
 94                 }
 95                 else
 96                 {
 97                     cout<<setw(3)<<a[i][j];
 98                 }                
 99                 cout<<endl;
100                 delete []a[i];
101         }
102         delete []a;
103         
104     }
105     return 0;
106 }

 

转载于:https://www.cnblogs.com/liuwt365/p/4174647.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值