程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 4941 Magical Forest(離散化)

HDU 4941 Magical Forest(離散化)

編輯:C++入門知識

HDU 4941 Magical Forest(離散化)


HDU 4941 Magical Forest

題目鏈接

題意:給定一些點,點有值,現在3種操作交換行,列,詢問某個點值

思路:這是簽到題,坐標系很大,所以把坐標離散化儲存,每次交換的時候只要把相應的行列坐標交換即可,查詢就在交換過的上面查就可以了

代碼:

#include 
#include 
#include 
#include 
using namespace std;

#define MP(a,b) make_pair(a,b)

typedef pair pii;
int t, n, m, k, xn, yn;
map val;
map X;
map Y;

void add(map &X, int x, int &xn) {
    if (X.count(x)) return;
    X[x] = xn++;
}

int main() {
    int cas = 0;
    scanf("%d", &t);
    while (t--) {
	val.clear();
	X.clear();
	Y.clear();
	xn = yn = 0;
	scanf("%d%d%d", &n, &m, &k);
	int x, y, v;
	while (k--) {
	    scanf("%d%d%d", &x, &y, &v);
	    add(X, x, xn);
	    add(Y, y, yn);
	    val[MP(X[x],Y[y])] = v;
	}
	scanf("%d", &k);
	int q, a, b;
	printf("Case #%d:\n", ++cas);
	while (k--) {
	    scanf("%d%d%d", &q, &a, &b);
	    if (q == 1) {
		add(X, a, xn);
		add(X, b, xn);
		swap(X[a], X[b]);
	    }
	    else if (q == 2) {
		add(Y, a, yn);
		add(Y, b, yn);
		swap(Y[a], Y[b]);
	    }
	    else {
		if (val.count(MP(X[a], Y[b])))
		    printf("%d\n", val[MP(X[a],Y[b])]);
		else
		    printf("0\n");
	    }
	}
    }
    return 0;
}


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved