Chinaunix首页 | 论坛 | 博客
  • 博客访问: 343596
  • 博文数量: 122
  • 博客积分: 5000
  • 博客等级: 大校
  • 技术积分: 1191
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-24 11:12
文章分类

全部博文(122)

文章存档

2010年(122)

我的朋友

分类: C/C++

2010-03-09 20:27:12

 

资源来源:http://blog.chinaunix.net/u3/105033/index.html

 

一、问题描述

Description

给定两个整数MN,生成一个M*N的矩阵,矩阵中元素取值为AZ26个字母中的一个,A在左上角,其余各数按顺时针方向旋转前进,依次递增放置,当超过26时又从A开始填充。例如,当M=5N=8时,矩阵中的内容如下:

   A   B   C   D   E   F   G   H

   V   W   X   Y   Z   A   B   I

   U   J   K   L   M   N   C   J

   T   I   H   G   F   E   D   K

   S   R   Q   P   O   N   M   L

Input

M为行数,N为列数,其中MN都为大于0的整数。

Output

分行输出相应的结果

Sample Input

4 9

Sample Output

   A   B   C   D   E   F   G   H   I

   V   W   X   Y   Z   A   B   C   J

   U   J   I   H   G   F   E   D   K

   T   S   R   Q   P   O   N   M   L

A

B

C

D

E

F

P

Q

R

S

T

G

O

X

W

V

U

H

N

M

L

K

J

I

 

二、分析解答

按照生成顺序先将结果填充到一个二维数组里,然后按照规定格式输入二维数组。设sM,N之中的最小者,那么要填充的圈数为r=(s+1)/2,包括最后一段(不是圈)。Fill()函数按顺时针顺序填充一个圈,因此调用rfill()进行填充,最后输入数据内容。

三、代码

 

#include<iostream>
char c[200][200];
char ch='A';
using namespace std;
//按照顺时针填充圆圈

void fill(int x0,int y0,int x1,int y1)
{
    //char ch=cc;

    int i,j;
    if(x0==x1)
    {
        for(j=y0;j<=y1;++j)
        {
            c[x0][j]=ch;
            ch=(ch-64)%26+65;
        }
    }
    else
    {
        if(y0==y1)
        {
            for(i=x0;i<=x1;++i)
            {
                c[i][y0]=ch;
                ch=(ch-64)%26+65;
            }
        }
        else
        {
            for(j=y0;j<=y1;++j)
            {
                c[x0][j]=ch;
                ch=(ch-64)%26+65;
            }
            for(i=x0+1;i<=x1;++i)
            {
                c[i][y1]=ch;
                ch=(ch-64)%26+65;
            }
            for(j=y1-1;j>=y0;--j)
            {
                c[x1][j]=ch;
                ch=(ch-64)%26+65;
            }
            for(i=x1-1;i>x0;--i)
            {
                c[i][y0]=ch;
                ch=(ch-64)%26+65;
            }
        }
    }

}
int main()
{
    int M,N;
    int i,j;
    scanf("%d%d",&M,&N);
    int s=M>N?N:M;
    int r=(s+1)/2;//多少圈

    for(i=0;i<r;++i)
    {
        fill(i,i,M-i-1,N-i-1);
    }
    for(i=0;i<M;++i)
    {
        for(j=0;j<N;++j)
        {
            printf(" %c",c[i][j]);
        }
        printf("\n");
    }
    return 0;
}


阅读(988) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~