劉汝佳書 例題4 5 UVA512

2021-09-14 01:30:39 字數 3054 閱讀 5132

【2019.3.29】

讀了書上的**:

1、模擬法

思想:二維陣列d中存放每個格仔的原始序號:i*10000+j

如:10001代表這個格仔最開始在1行1列

20003代表這個格仔最開始在2行3列

因此,二維陣列d的初值如下:

10001 10002 10003 ……

20001 20002 20003 ……

30001 30002 30003 ……

…… …… ……

二維陣列d經過一系列插入刪除後,會變成類似下面這樣的亂序(隨便瞎寫的):

0 30001 10003 ……

0 0 0

20002 0 40008……

……此時需要遍歷陣列d的每一行,每一列,根據格仔值來計算原始行列,然後再把當前行列填入二維陣列ans,

比如,30001的原始行列是3和1,當前行列是1和2,那麼ans[3][1]=10002

輸出時需要判斷ans[i][j]是否為0,如果為0,則輸出gone,否則輸出ans[i][j]

有一組測例是「插入空白列到最後一列的後面」,書上似乎沒有考慮到這種情況,在ins函式裡改後的**如下:

#include

#include

using

namespace std;

#define maxn 10000

int row, col;

char op[2]

;int d[

100]

[100];

int d2[

100]

[100];

int ans[

100]

[100];

int label[

100]

;//將d2中的第q行/列 複製到 d中的第p行/列

void

copyline

(char type,

int p,

int q)

else

}void

del(

char type)

if(type==

'r') row = cntd;

else col = cntd;

}void

ins(

char type)

if(label[i]

)copyline

(type,

++cntd,0)

;//與書上不同之處

if(type==

'r') row = cntd;

else col = cntd;

}int

main()

//dr dc ir ic

else

//對這些標籤做操作

if(op[0]

=='d'

)del

(op[1]

);else

ins(op[1]

);}}

//由原**d計算得到每個格仔的新位置,存在ans中

for(

int i=

1; i<=row; i++)}

//輸出

sheet_num++;if

(sheet_num!=

1) cout

"spreadsheet #"

cin>>data_num;

int rdata, cdata;

while

(data_num--)}

return0;

}

2、儲存command,對於每個查詢,都用一遍這個操作,計算得到新位置

這樣做的好處是避免了上面的「插入最後一行/列後」的問題

沒有用書上的**,書上用了結構體儲存command,和乙個子函式計算新位置,子函式引數為引用傳遞

下面的**用op陣列儲存指令,用label陣列儲存指令後跟著的label,在main函式裡計算新位置,顯得比較臃腫

#include

#include

using

namespace std;

int row,col;

char op[

1000][

2];int label[

1000][

11];int

main()

else

}//輸出第一部分

if(sheet_num>

0) cout

("spreadsheet #%d\n"

,++sheet_num)

;//輸入query並進行變換

int query_num;

cin>>query_num;

int qrow, qcol;

int oldrow, oldcol;

while

(query_num--

)else

if(qrow==label[i][2

]&& qcol==label[i][3

])}//插入或刪除指令

else

x+=cnt;

//插入行/列後,格仔的行/列數要增加

}//刪除指令

else

x-=cnt;

//刪除行/列後,格仔的行/列數要減少

}//更新位置

if(op[i][1

]=='r') qrow = x;

else qcol = x;}}

//每個query輸出一行答案

printf

("cell data in (%d,%d) "

, oldrow, oldcol);if

(isgone) cout<<

"gone"

printf

("moved to (%d,%d)\n"

, qrow, qcol);}

}return0;

}

劉汝佳書 例題4 4 UVA213

2019.3.28 這道題沒改直接ac!skr 感覺有點 自頂向下 的感覺了,沒有看書上的解法,但寫出來是差不多的 跟書上一樣用了二維陣列,比書上少寫了兩個子函式,用時更久 所用資料結構 二維陣列,編碼方式大概如下 000 01 10 000 001 010 011 100 101 110 我的解法...

UVA1388(劉汝佳白書例題)

uva1388 題意 乙個周長為10000的圓上均勻分布n個雕塑,現在再插入m個雕塑,希望n m個雕塑也能在這個圓上均勻分布。可能需要移動原有的一些雕塑。問 n個雕塑最小移動的總距離是多少。思路 首先需要找到原有的n個雕塑在插入m個雕塑後,它們每個的位置。n個雕塑的移動選乙個參考點,這個參考點是不動...

劉汝佳書 習題3 4 UVA455

uva刷題方法 2019.3.24 這道題注意pe錯誤 最後乙個輸出後沒有換行 貌似最後多了換行是wa錯誤,懵逼 三層迴圈 最外層迴圈是 i從1到strlen s 第二層迴圈是 j從第0個週期的第1個數字到第0個週期的最後乙個數字 最內層迴圈是 k從第0個週期到最後乙個週期 思路是 遍歷每一種週期數...