您的位置:首页 > 其它

【紫书】蛇形填数P40+nyoj33蛇形填数(原题)+ hdu2153仙人球的残影(变形蛇形填数) +nyoj852蛇形填数(二)

2018-02-05 18:30 323 查看
对矩阵进行填数:

1011121
916132
815143
7654
输入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++]
=m++;

i=n-1;
while(i>=1) a
[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;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: