using namespace std;
const int MAXLEN=85;
void zig_zag(int N){ /zig_zag的行进方向只会在第一行,第一列, 对角线才会发生改变 ,且第一行的改变方向是 右下右下,第一列的改变方向也是右下右下,除第 一个元素对角线的改变方向是左上左上。 / int z[MAXLEN][MAXLEN]={0}; bool flag1=0,flag2=0,flag3=0; //flag1=0表示现在要改变的方向为右,flag=1表示现在 //要改变的方向为下,flag2,flag3同理 int x=1,y=1; int dx=0,dy=1;//起始点是往右走 z[1][1]=1; int cnt=2;//要放进去的数值 while(cnt<N*N+1){ //第一行的改变方向点 if(x==1){ if(flag1==0){ dx=0,dy=1;//向右走 flag1=1; } else{ dx=1,dy=0;//向下走 flag1=0; } } if(y==1){ if(flag2==0){ dx=0,dy=1; flag2=1; } else{ dx=1,dy=0; flag2=0; } } if(x!=1&&x==y){ //向左走 if(flag3==0){ dx=0,dy=-1; flag3=1; } else{ dx=-1,dy=0; flag3=0; } } x+=dx, y+=dy; z[x][y]=cnt; cnt++; } for(int i=1;i<=N;i++){ for(int j=1;j<N;j++){ cout<<z[i][j]<<” “; } cout<<z[i][N];//没有空格 cout<<endl; } } int main(){
freopen("test.txt", "r", stdin);
int T=0; cin>>T; int cnt=0; while(T--){ cout<<"case #"<<cnt<<":"<<endl; int N=0; cin>>N; zig_zag(N); cnt++; }
}
using namespace std; vector> bg(int a) { vector> ans; vector now; for (int i=0;i>T; for (int I=0;I>N; cout<<”case #”<<I<<”:”<<endl; vector> bgn=bg(N); int x=0,y=0,len=1,flag=0,num=1; //flag 控制行走方向,0为右,1为左,2为上,3为下 while (x!=N && y!=N)//len控制当前边长,num为当前填的数 { bgn[x][y]=num; num++; if (flag==0) { x++; if (x==len && y==0) { flag=3; } if (x==len && y!=0) { flag=2; } } else { if (flag==3) { y++; if (y==len && x==len) { flag=1; } if (x==0) { flag=0; len++; } } else { if (flag==1) { x–; if (x==0) { flag=3; } } else { if (flag==2) { y–; if (y==0) { flag=0; len++; } } } } } } for (int i=0;i<bgn.size();i++) { for (int j=0;j<bgn.size();j++) cout<<bgn[j][i]<<” “; cout<<endl; } } return 0; } 找到普遍规律,改变方向
题解 类似于eoj 2983 蛇形图案
题解
using namespace std; int T,n,now; int tu[100][100]; void paint(int aa) { if(aa%2==0) { for(int i=1;i<=aa;i++) tu[i][aa]=now++; for(int j=aa-1;j>=1;j–) tu[aa][j]=now++; } else { for(int j=1;j<=aa;j++) tu[aa][j]=now++; for(int i=aa-1;i>=1;i–) tu[i][aa]=now++; } return; } int main() { cin>>T; for(int step=0;step>n; now=1; for(int i=1;i<=n;i++) paint(i); printf(“case #%d:\n”,step); for(int i=1;i<=n;i++) { int ff=1; for(int j=1;j<=n;j++) { if(ff) ff=0;else cout<<’ ‘; cout<<tu[i][j]; } cout<<endl; } } return 0; }
直接模拟,和螺旋矩阵差不多
include
using namespace std;
const int MAXLEN=85;
void zig_zag(int N){
/zig_zag的行进方向只会在第一行,第一列,
对角线才会发生改变 ,且第一行的改变方向是
右下右下,第一列的改变方向也是右下右下,除第
一个元素对角线的改变方向是左上左上。 /
int z[MAXLEN][MAXLEN]={0};
bool flag1=0,flag2=0,flag3=0;
//flag1=0表示现在要改变的方向为右,flag=1表示现在
//要改变的方向为下,flag2,flag3同理
int x=1,y=1;
int dx=0,dy=1;//起始点是往右走
z[1][1]=1;
int cnt=2;//要放进去的数值
while(cnt<N*N+1){
//第一行的改变方向点
if(x==1){
if(flag1==0){
dx=0,dy=1;//向右走
flag1=1;
}
else{
dx=1,dy=0;//向下走
flag1=0;
}
}
if(y==1){
if(flag2==0){
dx=0,dy=1;
flag2=1;
}
else{
dx=1,dy=0;
flag2=0;
}
}
if(x!=1&&x==y){
//向左走
if(flag3==0){
dx=0,dy=-1;
flag3=1;
}
else{
dx=-1,dy=0;
flag3=0;
}
}
x+=dx, y+=dy;
z[x][y]=cnt;
cnt++;
}
for(int i=1;i<=N;i++){
for(int j=1;j<N;j++){
cout<<z[i][j]<<” “;
}
cout<<z[i][N];//没有空格
cout<<endl;
}
}
int main(){
ifndef ONLINE_JUDGE
endif
}
include
using namespace std;
vector> bg(int a)
{
vector> ans;
vector now;
for (int i=0;i>T;
for (int I=0;I>N;
cout<<”case #”<<I<<”:”<<endl;
vector> bgn=bg(N);
int x=0,y=0,len=1,flag=0,num=1; //flag 控制行走方向,0为右,1为左,2为上,3为下
while (x!=N && y!=N)//len控制当前边长,num为当前填的数
{
bgn[x][y]=num;
num++;
if (flag==0)
{
x++;
if (x==len && y==0)
{
flag=3;
}
if (x==len && y!=0)
{
flag=2;
}
}
else
{
if (flag==3)
{
y++;
if (y==len && x==len)
{
flag=1;
}
if (x==0)
{
flag=0;
len++;
}
}
else
{
if (flag==1)
{
x–;
if (x==0)
{
flag=3;
}
}
else
{
if (flag==2)
{
y–;
if (y==0)
{
flag=0;
len++;
}
}
}
}
}
}
for (int i=0;i<bgn.size();i++)
{
for (int j=0;j<bgn.size();j++)
cout<<bgn[j][i]<<” “;
cout<<endl;
}
}
return 0;
}
找到普遍规律,改变方向
题解
类似于eoj 2983
蛇形图案
题解
include
using namespace std;
int T,n,now;
int tu[100][100];
void paint(int aa)
{
if(aa%2==0)
{
for(int i=1;i<=aa;i++) tu[i][aa]=now++;
for(int j=aa-1;j>=1;j–) tu[aa][j]=now++;
}
else
{
for(int j=1;j<=aa;j++) tu[aa][j]=now++;
for(int i=aa-1;i>=1;i–) tu[i][aa]=now++;
}
return;
}
int main()
{
cin>>T;
for(int step=0;step>n;
now=1;
for(int i=1;i<=n;i++) paint(i);
printf(“case #%d:\n”,step);
for(int i=1;i<=n;i++)
{
int ff=1;
for(int j=1;j<=n;j++)
{
if(ff) ff=0;else cout<<’ ‘;
cout<<tu[i][j];
}
cout<<endl;
}
}
return 0;
}
直接模拟,和螺旋矩阵差不多