对矩阵进行填数:
10 | 11 | 12 | 1 |
9 | 16 | 13 | 2 |
8 | 15 | 14 | 3 |
7 | 6 | 5 | 4 |
输入n,代表矩阵的大小为n*n,然后输入该方阵。
从数1开始填写,设 ”笔“的坐标为( x ,y ),则一开始 x=0,y=n-1。笔的移动情况就是:下,下,下,左,左,左,上,上,上,右,右,下,下,左,上。总之就是先下,到不能下为止,然后是左,接着是上,最后是右。
”不能填“指的是再走就走出边界(例如:4→5),或者这个各自已经做到过(例如:12→13)。如果把所有格子都初始化为0,就能够很好的判断。
#include <bits/stdc++.h>
using namespace std;
int a[20][20];
int main()
{
int n,tot;
cin>>n;
int x=0,y=n-1;
memset(a,0,sizeof(a));
tot=a[0][n-1]=1;
while(tot<n*n)
{
while(x+1<n&&!a[x+1][y])//向下走
a[++x][y]=++tot;
while(y-1>=0&&!a[x][y-1])//向左走
a[x][--y]=++tot;
while(x-1>=0&&!a[x-1][y])//向上走
a[--x][y]=++tot;
while(y+1<n&&!a[x][y+1])//向右走
a[x][++y]=++tot;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cout<<setw(3)<<a[i][j];
}
cout<<endl;
}
}
题目推荐:
nyoj33蛇形填数(原题)
hdu2153仙人球的残影(变形蛇形填数)
nyoj852蛇形填数(二)
//hdu2153仙人球的残影
#include<bits/stdc++.h>
using namespace std;
int a[101][101];
void Show(int x)
{
int i,j,m,n;
memset(a,0,sizeof(a));
i=1;
m=1;
j=2;
n=x;
while(i<=n) a[1][i++]=m++;
while(j<=n) a[j++][n]=m++;
i=n-1;
while(i>=1) a[n][i--]=m++;
j=n-1;
while(j>=2) a[j--][1]=m++;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
if(a[i][j])
printf("%3d",a[i][j]);
else
printf(" ");
cout<<endl;
}
}
int main()
{
int n;
while(cin>>n&&n!=0)
{
Show(n);
}
return 0;
}
//nyoj852蛇形填数(2)
#include <bits/stdc++.h>
using namespace std;
int a[1005][1005];
int main()
{
int t;cin>>t;
while(t--)
{
memset(a,0,sizeof(a));
int n;cin>>n;
int x=0,y=0,tot;
tot=a[x][y]=1;
while(tot<(n+1)*n/2)
{
while(y+1<n&&!a[x][y+1])//向右
a[x][++y]=++tot;
while(y-1>=0&&x+1<n&&!a[x+1][y-1])//向左下
a[++x][--y]=++tot;
while(x-1>=0&&!a[x-1][y])//向上
a[--x][y]=++tot;
}
for(int i=0;i<n;i++)
{
for(int j=0;j+i<n;j++)
{
if(j)cout<<' ';
cout<<a[i][j];
}cout<<endl;
}
}
}