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所写,转载请说明出处