描述
给定两个整数M,N,生成一个M*N的矩阵,矩阵中元素取值为A至Z的26个字母中的一个,A在左上角,其余各数按顺时针方向旋转前进,依次递增放置,当超过26时又从A开始填充。例如,当M=5,N=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
输入
M为行数,N为列数,其中M,N都为大于0的整数,M和N不大于50。
输出
分行输出相应的结果
样例输入
4 9
样例输出
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
思路:定义一个二位数组表示该矩阵,我定义的是一个二位整形数组,当然你也可以定义一个二位的字符数组.然后可以深搜的去旋转改变数组里的数值,当然也可以模拟路径去改变数值,下面我给出了两种方法的源码(ps:代码写的不好别喷哦),我是在堆里定义的数组,所以初始里面全是0,于是我就用1~26表示26个字母,当然你也可以去显示的初始化,那样你初始化为-1,就可以用0~25表示26个字母,这样更方便.
//深搜
#include <iostream>
#include <cstdio>
using namespace std;
int M,N;
int a[50][50];
int dx[] = {1,0,-1,0};
int dy[] = {0,1, 0, -1};
void dfs(int y,int x,int n,int flag)
{
if(n>M*N || a[y][x] != 0 || x<0 || y<0 ||
x>=N || y>=M)
return ;
a[y][x] = n%26+1;
n++;
if(flag == 3) //如果向上走,那么就继续向上
dfs(y+dy[3],x+dx[3],n,3);
for(int i= 0 ; i < 4; i++)
{
dfs(y+dy[i],x+dx[i],n,i);
}
}
int main()
{
cin>>M>>N;
dfs(0,0,0,0);
for(int i= 0 ; i < M ; i++)
{
for(int j = 0 ; j < N ;j++)
{
printf(" %c",a[i][j]+'A'-1);
}
printf("\n");
}
}
//模拟
#include <iostream>
#include <cstdio>
using namespace std;
int a[50][50];
int main()
{
int i , j , k , m , n;
int flag = 0;//0向→,1向↓,2向←,3向↑
cin>>m>>n;
i = j = 0;
for(k = 0 ; k < n*m ; k++)
{
if(flag == 0)
{
a[i][j++] = k%26+1;
if(j==n || a[i][j]!=0)
{
flag = 1;
i++;
j--;
}
}
else if(flag == 1)
{
a[i++][j] = k%26+1;
if(i==m || a[i][j]!=0)
{
flag = 2;
j--;
i--;
}
}
else if(flag == 2)
{
a[i][j--] = k%26+1;
if(j < 0 || a[i][j] !=0)
{
flag = 3;
i--;
j++;
}
}
else if(flag == 3)
{
a[i--][j] = k%26+1;
if(i < 0 || a[i][j]!=0)
{
flag = 0;
i++;
j++;
}
}
}
for(i = 0 ; i < m ; i++)
{
for(j = 0 ; j < n ; j++)
{
printf(" %c",a[i][j]+'A'-1);
}
printf("\n");
}
return 0;
}
一学妹让我帮她改了一代码后从其基础上又得到下面代码:
#include <cstdio>
#include <iostream>
using namespace std;
const int MAX_N=100;
int a[MAX_N][MAX_N];
int main()
{
int m,n,tot=0,x=0,y=0;
a[0][0] = 1;
cin>>m>>n;
while(tot<n*m-1)
{
while(y+1<n && a[x][y+1]==0)
a[x][++y]=(++tot)%26+1;
while(x+1<m && a[x+1][y]==0)
a[++x][y]=(++tot)%26+1;
while(y-1>=0 && a[x][y-1]==0)
a[x][--y]=(++tot)%26+1;
while(x-1>=0 && a[x-1][y]==0)
a[--x][y]=(++tot)%26+1;
}
for(x=0;x<m;x++)
{
for(y=0;y<n;y++)
{
printf(" %c",a[x][y]+'A'-1);
}
printf("\n");
}
return 0;
}