【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個週期到最後乙個週期 思路是 遍歷每一種週期數...