題目鏈接:acm.hdu.edu.cn/showproblem.php?pid=5671
2 3 4 2 1 2 3 4 2 3 4 5 3 4 5 6 1 1 2 3 1 10 2 2 2 1 10 10 1 1 1 2 2 1 2
12 13 14 15 1 2 3 4 3 4 5 6 1 10 10 1 Hint Recommand to use scanf and printf
有一個nn行mm列的矩陣(1 \leq n \leq 1000 ,1 \leq m \leq 1000 )(1≤n≤1000,1≤m≤1000),在這個矩陣上進行qq (1 \leq q \leq 100,000)(1≤q≤100,000) 個操作: 1 x y: 交換矩陣MM的第xx行和第yy行(1 \leq x,y \leq n)(1≤x,y≤n); 2 x y: 交換矩陣MM的第xx列和第yy列(1 \leq x,y \leq m)(1≤x,y≤m); 3 x y: 對矩陣MM的第xx行的每一個數加上y(1 \leq x \leq n,1 \leq y \leq 10,000)y(1≤x≤n,1≤y≤10,000); 4 x y: 對矩陣MM的第xx列的每一個數加上y(1 \leq x \leq m,1 \leq y \leq 10,000)y(1≤x≤m,1≤y≤10,000);對於每組數據,輸出經過所有q個操作之後的矩陣M。解題思路:如果單純進行模擬的話,數據量比較大,所以采用標記的方式。分別記錄當前狀態下每一行、每一列是原始數組的哪一行、哪一列即可。對每一行、每一列加一個數的操作,也可以兩個數組分別記錄。注意當交換行、列的同時,也要交換增量數組。輸出時通過索引找到原矩陣中的值,再加上行、列的增量。
詳見代碼。
#include#include #include using namespace std; int Map[1010][1010],a; int h[1010],l[1010],dh[1010],dl[1010]; int main() { int T; scanf("%d",&T); while (T--) { memset(dh,0,sizeof(dh)); memset(dl,0,sizeof(dl)); int n,m,q; scanf("%d%d%d",&n,&m,&q); for (int i=1; i<=n; i++) { for (int j=1; j<=m; j++) { scanf("%d",&Map[i][j]); h[i]=i; l[j]=j; } } for (int i=0; i