7-蛇形二維陣列
給定一個n行m列的二維陣列,左上角為1,蛇形遞增,輸出最後的陣列
1 2 3
8 9 4
7 6 5
程式碼1(自己寫的):
兩種方法均借鑑了wrong的思路,wrong的程式碼中第二種方法只寫了思路沒有除錯,所以出現了資料被覆蓋,自己的程式碼完善了wrong寫的第二種簡易方法。
#include <iostream>
#include <stdio.h>
const int maxn = 100;
using namespace std;
int snake[maxn][maxn];
int n,m;
bool boundary(int r,int c)
{
if(r<1 || r>n || c<1 || c>m)
return 0;
else
return 1;
}
int main()
{
int r = 1;int c = 1;
int cot = 1;
scanf("%d%d",&n,&m);
int d = 0; //控制方向0、1、2、3
int dir[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};
while(cot<=n*m)
{
//方法一
/* while(cot<=n*m)
{
snake[r][c] = cot;
c++;
cot++;
if(!boundary(n,m) || snake[r][c])
{
r++;
c--;
break;
}
}
while(cot<=n*m)
{
snake[r][c] = cot;
r++;
cot++;
if(!boundary(n,m) || snake[r][c])
{
r--;
c--;
break;
}
}
while(cot<=n*m)
{
snake[r][c] = cot;
c--;
cot++;
if(!boundary(n,m) || snake[r][c])
{
r--;
c++;
break;
}
}
while(cot<=n*m)
{
snake[r][c] = cot;
r--;
cot++;
if(!boundary(n,m) || snake[r][c])
{
r++;
c++;
break;
}
}
*/
//方法二
while(cot<=n*m)
{
snake[r][c] = cot++;
r+=dir[d][0]; //控制行座標
c+=dir[d][1]; //控制列座標
if(!boundary(r,c) || snake[r][c])
{
r-=dir[d][0]; //以下兩行為越界調整
c-=dir[d][1];
d++; //以下四行為提前調整到下一個位置
d%=4;
r+=dir[d][0];
c+=dir[d][1];
break;
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
printf("%4d",snake[i][j]);
printf("\n");
}
return 0;
}
程式碼2(西交wrong):
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
using namespace std;
const int maxn = 105;
typedef pair<int,int> P;
int mp[maxn][maxn]; //記錄輸出的值
int n,m;
bool in_bound(int r,int c)//判斷當前(r,c)是否合法
{
if(r>n||r<1||c>m||c<1) return false;
return true;
}
int main()
{
int cot=1,r=1,c=1; //當前處於r行c列
cin>>n>>m;
memset(mp,0,sizeof(mp));//mp陣列清零
/*方法一
while(cot<=n*m)
{
while(cot<=n*m)
{
mp[r][c]=cot;
cot++;
c++;
if(!in_bound(r,c)||mp[r][c]) break;
} //已經不能再向右行走
c--;
r++;
while(cot<=n*m)
{
mp[r][c]=cot;
cot++;
r++;
if(!in_bound(r,c)||mp[r][c]) break;
} //已經不能再向下行走
r--;
c--;
while(cot<=n*m){
mp[r][c]=cot;
cot++;
c--;
if(!in_bound(r,c)||mp[r][c]) break;
} //已經不能再向左行走
c++;
r--;
while(cot<=n*m){
mp[r][c]=cot;
cot++;
r--;
if(!in_bound(r,c)||mp[r][c]) break;
} //已經不能再向上行走
r++;
c++;
}
*/
//方法二
int d=0;//0 1 2 3
int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
while(cot<=n*m)
{
d%=4;
while(cot<=n*m)
{
mp[r][c]=cot++;
r+=dir[d][0];c+=dir[d][1];
if(!in_bound(r,c)||mp[r][c]) {r-=dir[d][0];c-=dir[d][1];d++;break;}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
printf("%4d",mp[i][j]);
cout<<endl;
}
return 0;
}
(感謝西交wrong學長提供以上題目練習)
相關文章
- JavaSE 陣列:一維陣列&二維陣列Java陣列
- js 一維陣列轉二維陣列JS陣列
- js 二維陣列轉一維陣列JS陣列
- 二維陣列陣列
- PHP中二維陣列與多維陣列PHP陣列
- 二維陣列排序陣列排序
- Java二維陣列Java陣列
- vector 二維陣列陣列
- 二維陣列和稀疏陣列互轉陣列
- C/C++ 二維陣列的理解(多維陣列)C++陣列
- php 二維陣列排序PHP陣列排序
- 二維陣列查詢陣列
- 二維樹狀陣列陣列
- 二維陣列行排序陣列排序
- 二維陣列練習陣列
- Java 二維陣列轉一維Java陣列
- 指標陣列和陣列指標與二維陣列指標陣列
- JAVA基礎--二維陣列Java陣列
- 二維陣列的獲取陣列
- Kotlin建立二維Int陣列Kotlin陣列
- 二維陣列與指標陣列指標
- 求二維陣列中最大子陣列的和陣列
- Java 學習筆記 二維陣列和物件陣列Java筆記陣列物件
- 二維陣列JSON.stringify 後,第二層陣列解析為空陣列JSON
- 二維陣列中的查詢陣列
- C的二維陣列(習題)陣列
- 二維陣列程式碼案例分析陣列
- 二維陣列傳參要點陣列
- js二維陣列新認識JS陣列
- Python如何對二維陣列求和Python陣列
- Rust與Java程式碼比較:將二維陣列轉為三維陣列RustJava陣列
- 二維陣列的指標的理解陣列指標
- 【JZOF】二維陣列中的查詢陣列
- C++ 使用 new 建立二維陣列C++陣列
- 資料結構之陣列和矩陣--矩陣&不規則二維陣列資料結構陣列矩陣
- Java實現普通二維陣列和稀疏陣列的相互轉換Java陣列
- 陣列記憶體地址解讀及二維陣列的遍歷陣列記憶體
- 二維陣列排序函式array_multisort()陣列排序函式