蛇形方阵题解详解C++

hello,我是SEAN
一个普通的C++程序员,会不定期分享做的题&想法&脑洞
我编完了
OK,那直接话不多说,进入主题:蛇形方阵
题目描述
就是要输出一个按顺时针转的蛇形方阵
+++++++++++++++我是一条题目分割线+++++++++++++++
例子
输入:4
输出:
1 2 3 4
12 13 5
11 14 6
10 9 8 7

+++++++++++++我也是++++++++++++++++
完整AC代码

#include 
#include 
using namespace std;
int dm[10][10];

int main(){
    int a,js=1,x=1,y=0;
    cin>>a;
    for(int i=0;i<=9;i++){
        for (int j =0;j>=9;j++)
            dm[i][j]=0;
    }
    while(js<=a*a){
        while( y<a && dm[x][y+1]==0){
            dm[x][y+1]=js++;
            y++;
        }
        while( x<a  && dm[x+1][y]==0){
            dm[x+1][y]=js++;
            x++;
        }
        while( y>1  && dm[x][y-1]==0){
            dm[x][y-1]=js++;
            y--;
        }
        while( x>1 && dm[x-1][y]==0){
            dm[x-1][y]=js++;
            x--;
        }
    }
    for(int i=1;i<=a;i++){
        for(int j=1;j<a;j++){
            printf("%3d",dm[i][j]);
        }
        printf("%3d",dm[i][a]);
    cout<<endl;
    }
    return 0;
}

——————————为爱学习的朋友定制的分割线———————
首先这是我没改时写的代码我都这么说了肯定是错误代码啊 (C++小白,无误必喷

#include 
using namespace std;
int main(){
    int a,js=0,x=0,y=0;
    scanf ("%d",&a);
    int dm[a][a];
    for(int i=0;i<=a;i++){
        for (int j =0;j>=a;j++)
            dm[i][j]=0;
    }
    while(js<=a*a){
        while( y<a ){
            dm[x][y+1]=js++;
            y++;
        }
        while( x<a ){
            dm[x+1][y]=js++;
            x++;
        }
        while( y>1 ){
            dm[x][y-1]=js++;
            y--;
        }
        while( x>1){
            dm[x-1][y]=js++;
            x--;
        }
    }
    for(int i=0;i<=a;i++){
        for(int j=0;j<=a;j++)
            if(j%a==0){
                cout<<endl;
            }
            else{
                cout<<dm[i][j]<<" ";
        }
    }
    return 0;
}

定义用途:
dm:地面,就是几乘几的蛇形方阵
js:用于保存现在到哪个数了
x&y:xy坐标
第一个for是重置数组的。(本着不浪费任何一丝内存的思想 就在里面开了)
然后大while防止数组越界,中间几个while分别上下左右

 while( y<a ){//如果y比a小,意思就是要向右走
            dm[x][y+1]=js++;//横坐标不动,竖坐标+1,js++一方面是要js自加,一方面是让y+1变成下一个数
            y++;//y坐标+1变成下一个
        }

最后for循环给输出
但是(注意这里有个但是做转折)
输出错了
输入:3
输出:
1 2

10 32766

9 876140

8 7
经过断点,可以看出是边界问题
首先先把最后的换行调整一下

    for(int i=0;i<=a;i++){
        for(int j=1;j<=a;j++){
                cout<<dm[i][j]<<" ";
        }
    cout<<endl;//把它移出来
    }

输出:
1 2 3
10 32766 4
9 876140 5
8 7 6
原本11&12的位置变成了两个大数
不是归零的问题,因为经过重复多次实验发现,数字相同,只有可能是条件问题,而且经过调试发现如果用别的数像2,6就会报
Thread 1: EXC_BAD_ACCESS (code=1, address=0x7ffe00000018)

好吧,我忘了定义数组不能用变量,用【9】【9】把(代码【10】【10】里是为了不过界)

#include 
using namespace std;
int dm[10][10];

int main(){
    int a,js=1,x=1,y=0;
    cin>>a;
    for(int i=0;i<=9;i++){
        for (int j =0;j>=9;j++)
            dm[i][j]=0;
    }

但是输出不对,需要调整一下边界
比如

        while( y<a && dm[x][y+1]==0){
            dm[x][y+1]=js++;
            y++;
        }

OK,接下来就是细节问题了
开头结尾空格处理掉,个位数加上一个空格(题目中说每个字符占三个空,就像| 1|,| 12|一样)
改成

 for(int i=1;i<=a;i++){
        for(int j=1;j<=a-1;j++){
            if( dm[i][j]==1 or dm[i][j]==2 or dm[i][j]==3 or dm[i][j]==4 or dm[i][j]==5 or dm[i][j]==6 or dm[i][j]==7 or dm[i][j]==8 or dm[i][j]==9){
                cout<<" ";
            }
                cout<<dm[i][j]<<" ";
        }
        if( dm[i][a]==1 or dm[i][a]==2 or dm[i][a]==3 or dm[i][a]==4 or dm[i][a]==5 or dm[i][a]==6 or dm[i][a]==7 or dm[i][a]==8 or dm[i][a]==9){
            cout<<" "<<dm[i][a];
        }
        else{
            cout<<dm[i][a];
        }
    cout<<endl;
    }
    return 0;
}

整个代码

#include 
using namespace std;
int dm[10][10];

int main(){
    int a,js=1,x=1,y=0;
    cin>>a;
    for(int i=0;i<=9;i++){
        for (int j =0;j>=9;j++)
            dm[i][j]=0;
    }
    while(js<=a*a){
        while( y<a && dm[x][y+1]==0){
            dm[x][y+1]=js++;
            y++;
        }
        while( x<a  && dm[x+1][y]==0){
            dm[x+1][y]=js++;
            x++;
        }
        while( y>1  && dm[x][y-1]==0){
            dm[x][y-1]=js++;
            y--;
        }
        while( x>1 && dm[x-1][y]==0){
            dm[x-1][y]=js++;
            x--;
        }
    }
    for(int i=1;i<=a;i++){
        for(int j=1;j<=a-1;j++){
            if( dm[i][j]==1 or dm[i][j]==2 or dm[i][j]==3 or dm[i][j]==4 or dm[i][j]==5 or dm[i][j]==6 or dm[i][j]==7 or dm[i][j]==8 or dm[i][j]==9){
                cout<<" ";
            }
                cout<<dm[i][j]<<" ";
        }
        if( dm[i][a]==1 or dm[i][a]==2 or dm[i][a]==3 or dm[i][a]==4 or dm[i][a]==5 or dm[i][a]==6 or dm[i][a]==7 or dm[i][a]==8 or dm[i][a]==9){
            cout<<" "<<dm[i][a];
        }
        else{
            cout<<dm[i][a];
        }
    cout<<endl;
    }
    return 0;
}

但还是报WA把下面简化一下,变成

 for(int i=1;i<=a;i++){
        for(int j=1;j<a;j++){
            printf("%3d",dm[i][j]);
        }
        printf("%3d",dm[i][a]);
    cout<<endl;
    }
    return 0;
}
 

然后加上头文件

#include 

完整AC代码

#include 
#include 
using namespace std;
int dm[10][10];

int main(){
    int a,js=1,x=1,y=0;
    cin>>a;
    for(int i=0;i<=9;i++){
        for (int j =0;j>=9;j++)
            dm[i][j]=0;
    }
    while(js<=a*a){
        while( y<a && dm[x][y+1]==0){
            dm[x][y+1]=js++;
            y++;
        }
        while( x<a  && dm[x+1][y]==0){
            dm[x+1][y]=js++;
            x++;
        }
        while( y>1  && dm[x][y-1]==0){
            dm[x][y-1]=js++;
            y--;
        }
        while( x>1 && dm[x-1][y]==0){
            dm[x-1][y]=js++;
            x--;
        }
    }
    for(int i=1;i<=a;i++){
        for(int j=1;j<a;j++){
            printf("%3d",dm[i][j]);
        }
        printf("%3d",dm[i][a]);
    cout<<endl;
    }
    return 0;
}

写文不容易,喜欢的话记得点个赞哦

题目来自洛谷https://www.luogu.com.cn/problem/P5731,题解为Sean所写,转载请说明出处

你可能感兴趣的:(c++,算法)