[C/C++]OJ練習題:Z字形掃描(Zigzag Scan) 更好的解題思路
>題目
詳見我的上一篇文章,這裡就不再贅述了:
題目雖簡單,不過做起來還是蠻有意思的,比單純的演算法好玩。
30行完活,如果再精簡一下,把花括號啥的處理處理。壓縮到20行以內完全不成問題。
>更好的解法
今天草稿紙掉地上之後,突然發現的。我們把矩陣旋轉過來,其實是這麼個效果:
其中,level的值是當前行矩陣座標(x,y)的x、y的和(x+y)。這可以很容易得到驗證。同時,每向下掃描一層,level正好加一。
於是,這題就變成判斷level的奇偶性,起奇偶性決定了當前行從左或是從右開始掃描;而掃描的結果,其本質是輸出x+y恰好等於level的所有組合。
這麼說未免有點太抽象,簡單寫了一段實現程式碼,結合程式碼來看吧。
*注意:下文中的void print(bool rowFirst,int level, int* base, int m, int n)複雜度為m*n,並不是最優的實現方法,但勝在寫起來方便。總的演算法複雜度為(m+n-1)*m*n。
>程式碼
#include <iostream> using namespace std; void print(bool rowFirst,int level, int* base, int m, int n){ if(!rowFirst){ int temp = m;m=n;n=temp; } for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ if(i+j==level){ if(rowFirst)cout<<"("<<i<<","<<j<<"):["<<*(base+i*n+j)<<"]"<<endl; else cout<<"("<<j<<","<<i<<"):["<<*(base+j*m+i)<<"]"<<endl; } } } } void zScan(int m, int n){ int matrix[m][n]; for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ cin>>matrix[i][j]; } } for(int level=0;level<=(m-1+n-1);level++){ bool rowFirst = level%2==1; print(rowFirst,level,matrix[0],m,n); } } int main(){ int N,m,n; cin>>N; while(N--){ cin>>m>>n; zScan(m,n); } return 0; }
測試資料:
/*
7
4 5
1 2 6 7 14
3 5 8 13 15
4 9 12 16 19
10 11 17 18 20
3 5
1 2 6 7 12
3 5 8 11 13
4 9 10 14 15
3 3
1 2 6
3 5 7
4 8 9
4 4
1 2 6 7
3 5 8 13
4 9 12 14
10 11 15 16
1 3
1 2 3
4 1
1
2
3
4
1 1
1
*/
相關推薦
[C/C++]OJ練習題:Z字形掃描(Zigzag Scan) 更好的解題思路
>題目 詳見我的上一篇文章,這裡就不再贅述了: 題目雖簡單,不過做起來還是蠻有意思的,比單純的演算法好玩。 30行完活,如果再精簡一下,把花括號啥的處理處理。壓縮到20行以內完全不成問題。 >更好的解法 今天草稿紙掉地上之後,
CCF CSP 程式設計題目和解答-----試題名稱:Z字形掃描-------201412-2
問題描述 試題編號: 201412-2 試題名稱: Z字形掃描 時間限制: 2.0s 記憶體限制: 256.0MB 問題描述: 問題描述 在影象編碼的演算法中,需要將一個給
Z字形掃描C語言演算法實現
#include<stdio.h> #include<stdlib.h> #define RIGHT 1 #define DOWN 2 #define LEFTDOWN 3 #define RIGHTUP 4 int main() {
CSP考試 2014年12月第2題 Z字形掃描 C語言實現
#include <stdio.h> int main() { //int NUM=4; int NUM; scanf("%d",&NUM); int a[NUM][NUM]; /* a[0][0]=1; a[0][1]=5; a[
[C/C++]OJ練習題: 壓縮字串&還原壓縮字串 [棧訓練]
>題目 給出一個定長的字串,進行壓縮或解壓。壓縮,給定一個最小需壓縮長度。如當最小需壓縮長度為3時,aaaabbc被壓縮成a4bbc。還原時,同樣以以上規則進行還原,如a5b3aba13b4被還原為aaaaabbbabaaaaaaaaaaaaabbbb。
演算法學習: Z 字形變換(c++)leetcode 6
leetcode 6: Z 字形變換 將一個給定字串根據給定的行數,以從上往下、從左到右進行 Z 字形排列。 比如輸入字串為 "LEETCODEISHIRING" 行數為 3 時,排列如下: L C I R E T O E S I I
CCF Z字形掃描 C語言解法
問題描述 在影象編碼的演算法中,需要將一個給定的方形矩陣進行Z字形掃描(Zigzag Scan)。給定一個n×n的矩陣,Z字形掃描的過程如下圖所示: 對於下面的4×4的矩陣, 1 5 3 9 3 7 5 6 9 4 6 4 7 3 1 3 對其進行Z字形掃描後得到長度為16的
[C/C++]OJ練習題:一元稀疏多項式計算器
>題目 多組資料,第一行為N,表示有N組資料;接下來的N組資料,每三行為一組:第一行為n,m,t三個數字(int,下同),n為第一個多項式的項數、m為第二個多項式的項數、t為計算模式(為1時,第一個多項式減第二個多項式;為0時兩個多項式相加);第二行為2n個數字
CCF CSP認證 題解:201412-2 Z字形掃描(Java語言原創)
問題描述 在影象編碼的演算法中,需要將一個給定的方形矩陣進行Z字形掃描(Zigzag Scan)。給定一個n×n的矩陣,Z字形掃描的過程如下圖所示: 對於下面的4×4的矩陣, 1 5 3 9 3 7 5 6 9 4 6 4 7 3 1 3 對其進行Z字形掃描後得
CCF201412-2 Z字形掃描(模擬)
得到 while ostream () turn rect pac clu 分隔 對於下面的4×4的矩陣, 1 5 3 9 3 7 5 6 9 4 6 4 7 3 1 3 對其進行Z字形掃描後得到長度為16的序列: 1 5 3 9 7 3 9 5 4 7 3
【CCF】Z字形掃描
txt color body math 編碼 div 表示 LG 元素 問題描述 在圖像編碼的算法中,需要將一個給定的方形矩陣進行Z字形掃描(Zigzag Scan)。給定一個n×n的矩陣,Z字形掃描的過程如下圖所示: 對於下面的4×4的矩陣, 1 5 3 9 3
csp-z字形掃描
col 方案 its img 內存 code http 註意 相等 問題描述 試題編號: 201412-2 試題名稱: Z字形掃描 時間限制: 2.0s 內存限制: 256.0MB 問題描述: 問題描述 在圖像編碼的算法中,需要將一個給定的
Z字形掃描
問題描述 在影象編碼的演算法中,需要將一個給定的方形矩陣進行Z字形掃描(Zigzag Scan)。給定一個n×n的矩陣,Z字形掃描的過程如下圖所示: 對於下面的4×4的矩陣, 1 5 3 9 3 7 5 6 9 4 6 4 7 3 1 3 對其進行Z字形掃描
201412-2-Z字形掃描-CCF
題目:http://118.190.20.162/view.page?gpid=T20 解題思路:把方陣分為兩部分,即n*n-(n*n-n)/2和(n*n-n)/2,如下兩種顏色的圖,然後一步一步模擬即可。 o o o o o o o o o #include<
CCF201403 Z字形掃描(JAVA)
問題描述: 問題描述 在影象編碼的演算法中,需要將一個給定的方形矩陣進行Z字形掃描(Zigzag Scan)。給定一個n×n的矩陣,Z字形掃描的過程如下圖所示: 對於下面的4×4的矩陣, 1 5 3 9 3 7 5 6 9 4 6 4
LeetCode演算法題6:Z 字形變換解析
將一個給定字串根據給定的行數,以從上往下、從左到右進行 Z 字形排列。 比如輸入字串為 “LEETCODEISHIRING” 行數為 3 時,排列如下: L C I R E T O E S I I G E D H N 之後,你的輸出需要從左往右逐行讀取,
CSP201412-2(Z字形掃描)(Java100分)
問題描述 在影象編碼的演算法中,需要將一個給定的方形矩陣進行Z字形掃描(Zigzag Scan)。給定一個n×n的矩陣,Z字形掃描的過程如下圖所示: 對於下面的4×4的矩陣, 1 5 3 9 3 7 5 6 9 4 6 4 7 3 1 3
leetcode演算法題6:Z 字形變換
題目:將一個給定字串根據給定的行數,以從上往下、從左到右進行 Z 字形排列。 比如輸入字串為 "LEETCODEISHIRING" 行數為 3 時,排列如下: L C I R E T O E S I I G E D H N 之後,你
ccf 201412-2 Z 字形掃描(100分)
問題描述 在影象編碼的演算法中,需要將一個給定的方形矩陣進行Z字形掃描(Zigzag Scan)。給定一個n×n的矩陣,Z字形掃描的過程如下圖所示: 對於下面的4×4的矩陣, 1 5 3 9 3 7 5 6 9 4 6 4 7
CCF-Z字形掃描 (Python) (90分,求大佬指正)
問題描述 試題編號: 201412-2 試題名稱: Z字形掃描 時間限制: 2.0s 記憶體限制: 256.0MB 問題描述: 問題描述 在影象編碼的演算法中,需要將一個給定的方形矩陣進行Z字形掃描(Zigzag Scan)。給定一個n×n的矩陣,Z字形掃