1. 程式人生 > >[C/C++]OJ練習題:Z字形掃描(Zigzag Scan) 更好的解題思路

[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演算法題6Z 字形變換解析

將一個給定字串根據給定的行數,以從上往下、從左到右進行 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演算法題6Z 字形變換

題目:將一個給定字串根據給定的行數,以從上往下、從左到右進行 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字形掃