编译器是vs
题目如图
思路如图
确定顶点的思路在详细说说,这个蛇形的是旋转的,4个顶点不好确认,只能按照方向来。
还有你的代码贴到代码块里面这样方便看和运行
你这蛇形图看不清楚啊,题目贴出来看看
#include<stdio.h>
int main()
{
enum dir{down=0,left,up,right};
int a[10][10] = {0};
int m;
scanf("%d",&m);
int k=0,i=0,j=3,n=1;
dir d = down;
for(k=0;k<m*m;k++)
{
a[i][j] = n;
n++;
switch(d)
{
case down:
{
if(i==m-1 || a[i+1][j] != 0)
{
d = left;
j--;
}
else
i++;
}
break;
case left:
{
if(j==0 || a[i][j-1] != 0)
{
d = up;
i--;
}
else
j--;
}
break;
case up:
{
if(i==0 || a[i-1][j] != 0)
{
d = right;
j++;
}
else
i--;
}
break;
case right:
{
if(j==m-1 || a[i][j+1] != 0)
{
d = down;
i++;
}
else
j++;
}
break;
}
}
for(i=0;i<m;i++)
{
for(j=0;j<m;j++)
printf("%3d",a[i][j]);
printf("\n");
}
return 0;
}
看的不是很清楚
首先确定你的输入只有一个,也就是 n, 后面那么多 scanf_s 肯定是不对的,直接对数组赋值,你看看是想用y还是想用个全局变量一直➕,这里考虑下
#include<stdio.h>
#include<string.h>
#define max 100
int a[max][max];
int main()
{
int x, y;
int n;
int start;
scanf("%d",&n);
memset(a, 0, sizeof(a));
x = 0;
y = n - 1;
start = a[x][y] = 1;
while (start < n * n)
{
while (x + 1 < n && !a[x + 1][y]) a[++x][y] = ++start;
while (y - 1 >=0 && !a[x][y-1]) a[x][--y] = ++start;
while (x-1>= 0 && !a[x - 1][y]) a[--x][y] = ++start;
while (y + 1 < n && !a[x][y+1]) a[x][++y] = ++start;
}
for (x = 0; x < n; x++)
{
for (y = 0; y < n; y++)
printf("%3d", a[x][y]);
printf("\n");
}
return 0;
}
这道题其实不太复杂吧?其实只要从1开始(起点),遇到要转弯的地方判断一下。
首先用两个变量(x和y,其中x=0,y=n-1,其实这两个变量就是初始下标)存起点(a[x][y]=1),然后while循环(tot用于存储方阵每个位置的值,所以初始化为1。这里tot<n×n是当tot的值等于n×n(蛇形方阵的最后一个值),那就跳出循环,输出)
下面,while循环里面,我的代码中“x+1<=n-1&&a[x+1][y]==0”的逻辑与(&&)具有“断路功能”,就是一旦左边条件越界不成立就“断开”,右边的条件就不会出现下标越界。下面的以此类推。
(注意:因为这个蛇形矩阵的方向顺序是:下,左,上,右……,所以要先判断:如果行下标+1小于等于第n行-1(x+1<=n-1),并且下一行还没有存值,那么说明还没到转弯点,就执行。剩下的向左,向上,向右的判断方法,以此类推。并且题主请注意,这四个判断条件不能调换位置!因为蛇形方阵的顺序永远是:下,左,上,右,下,左,上,右……)
其实这个while循环就是模拟蛇形方阵的形成过程。
(说这么详细,题主应该懂了吧?)
运行无报错,样例正确,代码:
#include<bits/stdc++.h>
using namespace std;
int a[10][10];
int main()
{
int n,x,tot,y;
scanf("%d",&n);
x=0;
y=n-1;
tot=1;
a[x][y]=1;//1的位置(起始位置)
while(tot<n*n){//四个方向模拟
while(x+1<=n-1&&a[x+1][y]==0){
x++;
tot++;
a[x][y]=tot;
}
while(y-1>=0&&a[x][y-1]==0){
y--;
tot++;
a[x][y]=tot;
}
while(x-1>=0&&a[x-1][y]==0){
x--;
tot++;
a[x][y]=tot;
}
while(y+1<=n-1&&a[x][y+1]==0){
y++;
tot++;
a[x][y]=tot;
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)printf("%3d",a[i][j]);
printf("\n");
}
return 0;
}
运行效果图:
各位,我想实现的效果是这样
#include<stdio.h>
int main(void)
{
int snake[8][8]={0};
int n;
printf("输入n:");
scanf_s("%d", &n);//确立数组大小;
int m;//实际角标
m = n - 1;
int a_1, a_2;//正方形的四个点;
a_1 = 0;
a_2 = m;
int b_1, b_2;
b_1 = m;
b_2 = m - 1;
int c_1, c_2;
c_1 = m - 1;
c_2 = 0;
int d_1, d_2;
d_1 = 0;
d_2 = 1;
int y_1 = 0;//y记录单个方向循环次数
int y_2 = 0;
int y_3 = 0;
int y_4 = 0;
int z_a = m + 1;//z确立每个矢量的累加次数上限
int z_b = m;
int z_c = m;
int z_d = m - 1;
if (n == 1)//区分奇偶
n++;
else if (n / 2 != 0)
n++;
for (int x=0; x < (n+1) / 2; x++)//x为总计次器,记录整圈循环
{
for (int z_1 = 0; y_1 < n / 2;z_1++)//a点移动次数不随奇偶改变,n/2和(n+1)/2结果是相同的
{
if (z_1 == z_a || z_a <= 0)//判断累加次数是否达到上限
{
z_1 = 0;//重置累加次数
z_a -= 2;//上限每次减2
break;
}
scanf_s("%d", &snake[a_1][a_2]);//a点往左下方走,行数+1,列数-1,且a点往下灌值,所以让行数参与循环
a_1++;
}
y_1++;
a_1 = 0 + y_1;//移动起始点a
a_2--;
for (int z_2 = 0; y_2 < (m + 1) / 2;z_2++)//b点移动次数会随奇偶改变的,当n为奇数时,m为偶数,(m+1)/2会比n/2少一次
{ //当n为偶数时,m为奇数,(m+1)/2等于n/2
if (z_2 == z_b||z_b<=0)
{
z_2 = 0;
z_b -= 2;
break;
}
scanf_s("%d", &snake[b_1][b_2]);//b点往左上方走,行数-1,列数-1,且b点往左灌值,所以让列数参与循环
b_2--;
}
y_2++;
b_1--;//移动起始点b
b_2 = m - 1 - y_2;
for (int z_3 = 0; y_3 < (m + 1) / 2;z_3++)//c点同理
{
if (z_3 == z_c || z_c <= 0)
{
z_3 = 0;
z_c -= 2;
break;
}
scanf_s("%d", &snake[c_1][c_2]);//c点往右上方走,行数-1,列数+1,且c点往上灌值,让行数参与循环
c_1 --;
}
y_3++;
c_1 = m - 1 - y_3;//移动起始点c
c_2++;
for (int z_4 = 0; y_4 < m / 2;z_4++)//d点移动次数也不会随着奇偶改变,而且永远比a少一次,所以m/2也不会随着奇偶改变
{
if (z_4 == z_d || z_d <= 0)
{
z_4 = 0;
z_d -= 2;
break;
}
scanf_s("%d", &snake[d_1][d_2]);//d点往右下方走,行数+1,列数+1,且d点往右灌值,让列数参与循环
d_2++;
}
y_4++;
d_1++;
d_2 = 1 + y_4;//移动起始点d
}
for (int i = 0; i < m+1; i++)//嵌套循环输出值
{
for (int j = 0; j < m+1; j++)
{
printf("%3d", snake[i][j]);
}
printf("\n");
}
return 0;
}

就是说,不是题目只输入个n那种,我在尝试新的东西
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!