標籤:log 遊戲 整數 格式 nbsp char 協助 數組 content
最近,亮亮和小W都對蘋果高度興趣!在研究了“最大蘋果矩陣”和“給蘋果樹施肥”的問題後,他們又遇到了一個新的問題:
有一塊長n米、寬m米的地,現在小W把地劃分成邊長1米的小正方形塊,共n*m個塊。每個塊中可能種有一棵蘋果樹,或放有一個iPhone,也可以什麼也沒有。然而,亮亮擁有一種超能力,可以將2個寬1米、長度相同的矩形塊在空間中直接交換。
亮亮經常對著農場施展超能力,為了不把自己搞暈,他每次總是選擇兩整行(長度均為m米)或兩整列(長度均為n米)進行交換。小W對此十分惱火——當他想拿iPhone打遊戲時,卻莫名其妙地撞在了蘋果樹上。小W要求你寫一個程式,協助他確定某一正方形塊中放了什麼東西。
輸入
輸入包含多組資料,請處理到檔案結束。
每組資料,第一行2個整數n、m,表示地的尺寸。
之後n行,每行m個英文字母,大寫的T表示這裡種有蘋果樹,小寫i表示這裡放有iPhone,其他字元表示這裡什麼也沒有。
之後1行,一個整數Q,表示小W詢問的次數。
之後Q行,包含3個整數,可能有以下情況:
1 i1 j1 表示小W想知道第i1行第j1列的方塊中有什麼東西。
2 i1 i2 表示亮亮交換了第i1行與第i2行。
3 j1 j2 表示亮亮交換了第j1列與第j2列。
對於100%的資料,有1<=n*m<=106,1<=Q<=105,1<=i1, i2<=n,1<=j1, j2<=m。
輸出
對於每組資料,輸出以一行“Case #x:”開頭,x表示資料的編號,從1開始。
對於小W的每次格式為“1 i j”的詢問,輸出一行。若方塊中是蘋果樹,輸出"Tree"。若方塊中是iPhone,輸出“Phone”。若方塊中什麼也沒有,輸出“Empty”。
--本文
雖然是區間修改,求1點,不過由於每次只是交換兩行或兩列,並不需要什麼樹狀數組。
考慮一下,每次交換i1和i2行的時候
實際上就是原來的i1行變成了i2行(交換列同理)
所以只需要通過建立映射(大概吧,也不知道怎麼形容)即可
每次交換的時候,改變一下映射值
#include <stdio.h>int main(){ int m,n; int total = 0; while (scanf("%d %d",&n,&m) != EOF) { total ++; printf("Case #%d:\n",total); char field[n+1][m+1]; int nown[n+1],nowm[m+1]; int i,j; for (i=1;i<=m;i++) nowm[i] = i; for (i=1;i<=n;i++){ char row[1000001]; nown[i] = i; scanf("%s",row); for (j=1;j<=m;j++){ field[i][j] = row[j-1]; } } int q; scanf("%d",&q); for (i=1;i<=q;i++){ int order,i1,i2; scanf("%d %d %d",&order,&i1,&i2); if (order == 1){ char now = field[nown[i1]][nowm[i2]]; if (now == ‘T‘){ printf("Tree\n"); } else if (now == ‘i‘){ printf("Phone\n"); } else printf("Empty\n"); } if (order == 2){ int temp = nown[i1]; nown[i1] = nown[i2]; nown[i2] = temp; } if (order == 3){ int temp = nowm[i1]; nowm[i1] = nowm[i2]; nowm[i2] = temp; } } } return 0; }
XidianOJ 1001 又是蘋果