#
最大流
POJ 1273 Drainage Ditches
POJ 1274 The Perfect Stall (二分圖匹配)
POJ 1698 Alice's Chance
POJ 1459 Power Network
POJ 2112 Optimal Milking (二分)
POJ 2455 Secret Milking Machine (二分)
POJ 3189 Steady Cow Assignment (枚舉)
POJ 1637 Sightseeing tour (混合圖歐拉回路)
POJ 3498 March of the Penguins (枚舉匯點)
POJ 1087 A Plug for UNIX
POJ 1149 Pigs (構圖題)
ZOJ 2760 How Many Shortest Path (邊不相交最短路的條數)
POJ 2391 Ombrophobic Bovines (必須拆點,否則有BUG)
WHU 1124 Football Coach (構圖題)
SGU 326 Perspective (構圖題,類似于 WHU 1124)
UVa 563 Crimewave
UVa 820 Internet Bandwidth
POJ 3281 Dining (構圖題)
POJ 3436 ACM Computer Factory
POJ 2289 Jamie's Contact Groups (二分)
SGU 438 The Glorious Karlutka River =) (按時間拆點)
SGU 242 Student's Morning (輸出一組解)
SGU 185 Two shortest (Dijkstra 預處理,兩次增廣,必須用鄰接陣實現,否則 MLE)
HOJ 2816 Power Line
POJ 2699 The Maximum Number of Strong Kings (枚舉+構圖)
ZOJ 2332 Gems
JOJ 2453 Candy (構圖題)
SOJ3312 Stockholm Knights
SOJ3353 Total Flow
SOJ2414 Leapin' Lizards
最小割
SOJ3106 Dual Core CPU
SOJ3109 Space flight
SOJ3107 Select
SOJ3185 Black and white
SOJ3254 Rain and Fgj
SOJ3134 windy和水星 -- 水星交通
HOJ 2634 How to earn more
ZOJ 2071 Technology Trader (找割邊)
HNU 10940 Coconuts
ZOJ 2532 Internship (找關鍵割邊)
POJ 1815 Friendship (字典序最小的點割集)
POJ 3204 Ikki's Story I - Road Reconstruction (找關鍵割邊)
POJ 3308 Paratroopers
POJ 3084 Panic Room
POJ 3469 Dual Core CPU
ZOJ 2587 Unique Attack (最小割的唯一性判定)
POJ 2125 Destroying The Graph (找割邊)
ZOJ 2539 Energy Minimization
TJU 2944 Mussy Paper (最大權閉合子圖)
POJ 1966 Cable TV Network (無向圖點連通度)
HDU 1565 方格取數(1) (最大點權獨立集)
HDU 1569 方格取數(2) (最大點權獨立集)
POJ 2987 Firing (最大權閉合子圖)
SPOJ 839 Optimal Marks (將異或操作轉化為對每一位求最小割)
HOJ 2811 Earthquake Damage (最小點割集)
2008 Beijing Regional Contest Problem A Destroying the bus stations ( BFS 預處理 )(
http://acmicpc-live-archive.uva.es/nuevoportal/data/problem.php?p=4322)
ZOJ 2676 Network Wars (參數搜索)
POJ 3155 Hard Life (參數搜索)
ZOJ 3241 Being a Hero
有上下界
ZOJ 2314 Reactor Cooling (無源匯可行流)
POJ 2396 Budget (有源匯可行流)
SGU 176 Flow Construction (有源匯最小流)
ZOJ 3229 Shoot the Bullet (有源匯最大流)
HDU 3157 Crazy Circuits (有源匯最小流)
最小費用流
HOJ 2715 Matrix3
HOJ 2739 The Chinese Postman Problem
POJ 2175 Evacuation Plan (消一次負圈)
POJ 3422 Kaka's Matrix Travels (與 Matrix3 類似)
POJ 2516 Minimum Cost (按物品種類多次建圖)
POJ 2195 Going Home
BUAA 1032 Destroying a Painting
POJ 2400 Supervisor, Supervisee (輸出所有最小權匹配)
POJ 3680 Intervals
HOJ 2543 Stone IV
POJ 2135 Farm Tour
BASHU2445 餐巾問題
---------------------------------------------onmylove原創
最大流題目:
TC:
Single Round Match 200 Round 1 – Division I, Level Three
Single Round Match 236 Round 1 – Division I, Level Three
Single Round Match 399 Round 1 – Division I, Level Three
同Hoj1024: http://acm.hust.edu.cn/thx/problem.php?id=1024
2003 TCO Semifinal Round 4 – Division I, Level Three
2004 TCCC Championship Round – Division I, Level Three
2005 TCO Sponsor Track Round 3 – Division I, Level One
混合圖的歐拉回路
Poj1637: http://acm.pku.edu.cn/JudgeOnline/problem?id=1637
zju1992:http://acm.zju.edu.cn/show_problem.php?pid=1992
求增廣邊:
Poj3204:http://acm.pku.edu.cn/JudgeOnline/problem?id=3204
類似:Hoj1082: http://acm.hust.edu.cn/thx/problem.php?cid=1017&pid=6
項目選擇問題:
Poj3469:http://acm.pku.edu.cn/JudgeOnline/problem?id=3469
Zoj2930:http://acm.zju.edu.cn/show_problem.php?pid=2930
求項目選擇項目最多的方案。
建圖:
Poj1149:http://acm.pku.edu.cn/JudgeOnline/problem?id=1149
Poj3436:http://acm.pku.edu.cn/JudgeOnline/problem?id=3436
Poj3281:http://acm.pku.edu.cn/JudgeOnline/problem?id=3281
連通度:
點連通度Poj1966: http://acm.pku.edu.cn/JudgeOnline/problem?id=1966
Uva563, http://icpcres.ecs.baylor.edu/onlinejudge/
點不交的路徑條數問題,需要拆點
最小割:
Poj2914:http://acm.pku.edu.cn/JudgeOnline/problem?id=2914
(stoer-Wagner)
基本題:
Poj3498:http://acm.pku.edu.cn/JudgeOnline/problem?id=3498
枚舉:做n次最大流。
Poj1087:http://acm.pku.edu.cn/JudgeOnline/problem?id=1087
可以用最大流做,也可以用二分圖匹配做。
Poj1273:http://acm.pku.edu.cn/JudgeOnline/problem?id=1273
Poj1274:http://acm.pku.edu.cn/JudgeOnline/problem?id=1274
Poj1325: http://acm.pku.edu.cn/JudgeOnline/problem?id=1325
poj1459:http://acm.pku.edu.cn/JudgeOnline/problem?id=1459
Poj1797:http://acm.pku.edu.cn/JudgeOnline/problem?id=1797
Poj1815:http://acm.pku.edu.cn/JudgeOnline/problem?id=1815
poj2112:http://acm.pku.edu.cn/JudgeOnline/problem?id=2112
poj2239:http://acm.pku.edu.cn/JudgeOnline/problem?id=2239
poj2289: http://acm.pku.edu.cn/JudgeOnline/problem?id=2289
Poj2391:http://acm.pku.edu.cn/JudgeOnline/problem?id=2391
Poj2987:http://acm.pku.edu.cn/JudgeOnline/problem?id=2987
Poj3308:http://acm.pku.edu.cn/JudgeOnline/problem?id=3308
提示:最大權閉包,轉化成最大流
Poj3155: http://acm.pku.edu.cn/JudgeOnline/problem?id=3155
難
SGU 176 http://acm.sgu.ru/problem.php?contest=0&problem=176
容量有上下界的網絡流問題,有難度
Spoj660:http://www.spoj.pl/problems/QUEST4/
Spoj377:http://www.spoj.pl/problems/TAXI/
UVA
http://icpcres.ecs.baylor.edu/onlinejudge/
753,
820,
10122,
10330,
10511,
10735.
題意:求1->n的兩條不相交的最短路(兩條路徑可以共頂點但是不能共邊)
心得:看了AC的博客學的,呵呵,這題充分展示了一切皆是網絡流的核心思想。做法:首先找出以1為頂點的最短路徑樹,1到樹中任意一點的連線都是最短路徑,首先把這些邊加到網絡流的邊集中,容量為1。
然后再枚舉下邊,將不在最短路徑樹上但是在最短路上的邊也加到網絡流的邊集中,容量為1。跑一遍1到n的最大流,如果流量>=2則有解,再從原點深搜路徑即可。
確切的來說,只要在后來建的圖中隨便找一條路徑均是原點到該點的最短路(注意邊是單向的),又因為限制了流量是1,所以一條邊只能選取一次,這樣跑出來的流量就一定是不相交最短路的條數。
int mat[maxn][maxn];
int n,m;

int dis[maxn];
int use[maxn];
void SPFA(int n,int s)


{
fill(dis,dis+n,INF);
fill(use,use+n,0);
queue<int>Q;
dis[s]=0;
use[s]=1;
Q.push(s);
while(!Q.empty())

{
int x=Q.front();Q.pop();
use[x]=0;
for(int i=0;i<n;i++)

{
if(dis[x]+mat[x][i]<dis[i])

{

dis[i]=dis[x]+mat[x][i];
if(!use[i])

{
use[i]=1;
Q.push(i);
}
}
}
}
}
int flag=0;
void dfs(int x)


{
if(flag==1)return;
if(x==n-1)

{
flag=1;
printf("%d\n",x+1);
return;
}
else printf("%d ",x+1);

for(node *p=adj[x];p;p=p->next)

{
if((p-edge)&1)continue;

if(p->flow==0)
{
p->flow=-1;
dfs(p->v);
if(flag==1)
return;
}
}

}


int main()


{
scanf("%d %d",&n,&m);
int a,b,c;
for(int i=0;i<n;i++)

{
for(int j=0;j<n;j++)

{
if(i==j)mat[i][j]=0;
else mat[i][j]=INF;
}
}
for(int i=0;i<m;i++)

{
scanf("%d%d%d",&a,&b,&c);
a--;b--;
if(c<mat[a][b])
mat[a][b]=mat[b][a]=c;
}
SPFA(n,0);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)

{
if(i==j)continue;
if(dis[i]+mat[i][j]==dis[j])
insert(i,j,1);
}
int ans=sap(n,0,n-1);

if(ans<2)
{
printf("No solution\n");
return 0;
}
flag=0;
dfs(0);
flag=0;
dfs(0);
return 0;
}
很難得的一次寫對了SPFA...
參考了AC大神的代碼,遞歸刪除邊的時候將流量置為-1,不錯的想法。另外我用p-edge的奇偶性判斷正反邊,但是一直沒弄明白p和edge都是地址而且地址相差并不是1的時候減出來卻是1。。。
摘要: 實在不行,改了方法。SET 0和SET 1用延遲標記,翻轉不用任何標記,直接更新到底。800+MS AC.
#include<cstdlib>#include<iostream>#include<algorithm>#include<cstdio>using namespace std;int const m...
閱讀全文
摘要: 這題有點像Hotel的包裝版,非常經典,讓我進一步熟悉了線段樹的區間操作(主要是延遲標記的使用)。唯一的問題出在自己寫的二分函數上,死活都是TLE,后來參考了小HH的二分才過掉,不知道自己哪寫掛了,郁悶。。。。PS:順便問一下,高質量的內存管理難道真的是用線段樹實現的?
#include<iostream>#include<algorithm>#include<ve...
閱讀全文
題意:可以標記區間上某些節點或者取消標記,并查詢與x連續的未被標記的結點數。
這題和Hotel類似,由于換成了單節點操作,不需要區間操作的延遲標記,維護起來更方便。
#include<iostream>
#include<algorithm>
using namespace std;
int const maxn=50010;
#define LL(i) (i<<1)
#define RR(i) ((i<<1)+1)

struct node


{

int l,r;
int lval,rval;
int len()

{
return r-l+1;
}
}ST[maxn*4];
int n,m;

void build(int l,int r,int i)


{
ST[i].l=l;
ST[i].r=r;
if(l==r)

{
ST[i].lval=1;
ST[i].rval=1;
return;
}
int mid=(l+r)>>1;
build(l,mid,LL(i));
build(mid+1,r,RR(i));
ST[i].lval=ST[i].len();
ST[i].rval=ST[i].len();
}


void update(int x,int op,int i)


{

if(ST[i].l==ST[i].r)

{
if(op==1)
ST[i].lval=ST[i].rval=0;
else if(op==0)
ST[i].lval=ST[i].rval=1;
return;
}
int mid=(ST[i].l+ST[i].r)>>1;
if(x<=mid) update(x,op,LL(i));
else update(x,op,RR(i));

ST[i].lval=ST[LL(i)].lval;
ST[i].rval=ST[RR(i)].rval;

if(ST[LL(i)].lval==ST[LL(i)].len())
ST[i].lval+=ST[RR(i)].lval;
if(ST[RR(i)].rval==ST[RR(i)].len())
ST[i].rval+=ST[LL(i)].rval;
}


int Query(int x,int i)


{
if(ST[i].l==ST[i].r)
return ST[i].lval;
int mid=(ST[i].l+ST[i].r)>>1;
if(x<=mid)

{
if(x<=ST[i].lval)
return ST[i].lval;
if(x>=ST[LL(i)].r-ST[LL(i)].rval+1)
return ST[LL(i)].rval+ST[RR(i)].lval;
else return Query(x,LL(i));
}
else

{
if(x>=ST[i].r-ST[i].rval+1)
return ST[i].rval;
if(x<=ST[RR(i)].l+ST[RR(i)].lval-1)
return ST[RR(i)].lval+ST[LL(i)].rval;
else return Query(x,RR(i));
}
}


int d[maxn];
int pd=0;

int main()


{
while(scanf("%d%d",&n,&m)!=EOF)

{
build(1,n,1);
char op[100];
int x;
pd=0;
for(int i=0;i<m;i++)

{

scanf("%s",op);
if(op[0]=='D')

{
scanf("%d",&x);
update(x,1,1);
d[pd++]=x;
}
else if(op[0]=='Q')

{

scanf("%d",&x);
printf("%d\n",Query(x,1));
}
else

{
update(d[--pd],0,1);
}
}
}
return 0;
}
很顯而易見的線段樹,只是有一點需要注意,題目中雖然給了h的范圍可以達到10^9,但是由于布告總共只有200000條,最壞情況下只需要200000個線段樹的葉子節點,所以可以直接無視h的范圍,線段樹總結點開200000*4即可。維護的時候,注意利用回溯,自底向上地更新。
#include<iostream>
using namespace std;
int const maxn=200010;

int h,w,n;
int num[maxn];
struct node


{
int size;
int l,r;
}ST[maxn*6];

void creat(int l,int r,int i)


{
ST[i].l=l;
ST[i].r=r;
if(l==r)

{
ST[i].size=w;
return;
}
int mid=(l+r)>>1;
creat(l,mid,i*2);
creat(mid+1,r,i*2+1);
ST[i].size=w;
}

int ans;
void Query(int i,int x)


{
if(ST[i].l==ST[i].r)

{
ans=ST[i].l;
ST[i].size-=x;
return ;
}
if(ST[i*2].size>=x)
Query(i*2,x);

else if(ST[i*2+1].size>=x)
Query(i*2+1,x);
ST[i].size=max(ST[i*2].size,ST[i*2+1].size);
}

int main()


{

while(scanf("%d%d%d",&h,&w,&n)!=EOF)

{
creat(1,min(h,200000),1);
for(int i=0;i<n;i++)

{

int x;
scanf("%d",&x);
if(ST[1].size<x)
printf("-1\n");
else

{

Query(1,x);
printf("%d\n",ans);
}

}


}
return 0;


}
摘要: 接連做了維修數列和這個題,看來線段樹能做的區間操作,用splay樹應該也是可以的(都是打一個延遲標記嘛),做這題時發現有一點很重要,就是當我們壓入延遲標記的時候(不管是push_down還是C a,b,c時都需要)一定要保證這個結點代表區間的最新信息。
#include <iostream>using...
閱讀全文
前一天晚上12點就睡了,睡得不是很好,做了幾個夢,醒來了幾次,其中夢到cyl卡F
題,然后很水的B題最后才過。沒想到夢也成真了,只不過題號有偏差。
鑒于集訓的時候我們隊錯誤較多,加上熱身賽的觀察,我們并不覺得自己速度上有太 大劣勢,于是決定采取謹慎的策略,每題提交前再看一遍代碼,檢查檢查。
還是老策略:我從前往后看,kb看中間,cyl看后面。看了A題,發現看不懂,再看了
一遍,還是不懂,這是kb跟我說C題是3D凸包,求面數,大水題,果斷要過來,但是沒有馬
上開。繼續讀B題,感覺是一個貪心,跟kb說了一個方法,kb也跟我說了一個方法,突然發
現我們的方法截然相反,于是我丟給他想,果斷上去寫C題吧。后來證實我們的算法其實是
一樣的。寫C題的時候看了一下board,發現有人過F,問了問cyl,他說他在規劃了,我說
隨時推我下來。之后他利落的過掉了F題。然后我繼續寫C,cyl接手B,kb在想E。經過他們
討論后證明了算法正確性,cyl上機,提交,結果錯了,看程序,發現了他一個很弱智的錯
誤,修改后就過了。我利用空閑斷斷續續的寫好了C,由于很容易錯,于是打印出來檢查。
kb上去寫A,其間kb跟cyl說了H的做法,cyl規劃好了構圖方法,讓我過了C后幫他敲一個費
用流的模板。在59分鐘我很利落的一次過了C題,也是全場第一個。之后很長時間都沒有人
過,第二個應該是石頭哥。之后kb的A題返回wrong answer,他跟cyl討論了一下,發現對
題目的理解有問題,迅速修改。我和cyl也在kb改A的時候討論好了D題,一個裸的dancing
links,商量好構圖后,決定讓我來寫,其實我沒有太大的信心,因為這個東西是在來哈爾濱的火車上學的,還從
來沒有寫過,同時還討論了已經很多
油ü腅題,結果不會。很快kb的A過了。我幫cyl敲完了H的模板,他構圖寫進去也很順利
的通過了。就這樣前2個鐘我們過了5個題目,手頭上還有2個題目在做,形勢不錯。
然后讓cyl暴力E打表找規律,畢竟很多隊過了,不會太麻煩,其間我一直在寫D,寫得
很糾結。事實上當時我們的排名一直在往下掉,我敲D的時候手一直很僵,頭很暈,補了一
塊巧克力,好了一點。最終經過努力,kb還是在209分鐘過掉了E題。我們終于緩了一口氣
。在cyl的幫助下,我的D也搞定了,測了幾組簡單的數據沒有錯,我問他要不要提交,他
說交,怕什么?說實話我是沒有任何信心的,首先這個東西不熟,其次覺得自己寫得很亂
,畢竟200多行的代碼,錯誤在所難免,最后就是這題只給了1秒的時限,感覺蠻緊的。結
果居然返回一個YES。我和cyl都叫了出來,頓時士氣大振。在我調試D題的時候,kb和cyl
討論了J,沒想到什么好方法,用四邊形不等式只能優化到O(n^2),肯定不行,但是沒有題
目,還是讓kb硬著頭皮上了。然后cyl弄I題,kb說自己的肯定過不了,于是讓我再想J。我
列了一條式子,發現具有單調性,然后跟kb討論了一下,被他質疑了,其實我還是很肯定
的,于是還是給他寫完吧,我繼續想。他提交毫無疑問返回了超時,我也在書中翻出了類
似于我列出的那條式子的式子,還剩下30分鐘,時間還足夠,于是果斷搶過機器,利用kb
之前寫的預處理,直接把dp寫了上去,寫完后他們一起幫我查錯,提交,答案錯了,再檢查,發現打反了一個符號,修改,再提交,一個大大的綠色的YES。 我大喊了一聲:“哥立功了!”。真是內牛滿面。然后我就果斷打醬油了,他們兩個在討
論那個積分題,后來才發現算錯了一個東西,不夠時間改了。最終定格8題,5題一次過的
,2個wrong answer,一個TLE。其中那兩個wrong answer完全可以避免。
后來跟石頭哥他們討論才發現G題他們的方法跟kb想的一樣,kb覺得時間太緊于是沒有
做,實在太可惜了,最后10多分鐘寫一個SPFA也不是什么難事的。其實想想卡E和D的期間
上G也是一個不錯的選擇。總結這次比賽,最大的敗筆就是E題,一個毫無疑問的大水題,
我們被卡了很久很久,浪費了很多時間,似乎我們的3個隊對于這類題目都很水,還得加強
鍛煉。或許如果比賽前期就丟J給我,我們對于時間的安排就會更為合理。至于我個人的發
揮,我比較滿意,兩個200多行的代碼都是1AC,J題也頂住壓力絕殺成功,事實上08年在北
京我也是最后30分鐘絕殺一道單調性dp的題目。
說說隊員間的配合。我們隊算是磨合得比較好的,其中D題的構圖是我和cyl討論出來
的,B題的正確性是kb和cyl討論出來的,H題算法是kb提出,模板是我抄的,其他代碼由c
yl完成。J題kb提供了預處理。
最后bless 1,2,8隊在下一站天津賽區中再創佳績!
--
其實結果就一句話:“混水摸到魚了。”
農歷八月十七,中秋節后,經過漫漫四十多個小時的火車,我們終于到了這個傳說中冰天
雪地的哈爾濱。下火車,天氣好,晴朗陽光下伴著瑟瑟涼風,有點凍……
星期天早上九點多,比賽正式開始。
開ball,我調機器,然后從前看,石頭哥D開始,訓哥后面看題。
看完A后,我發現題目規模巨大,馬上淡定了,心想應該不用什么復雜的博弈,但還是放了 下來。
這時,石頭哥看完C、D,說D用在火車上新學會的dancing link可以搞搞,C是純模板題,
然后果斷讓位給石頭哥拍C模板。
我繼續看B,好像原來B更水,幾番思前想后,我還是直接搶斷石頭哥的C,自己敲B,因為
B真的好像很水……B的做法是兩次排序然后for一下,直接過了。
刷board,有人過F,chyx也跟風很快過掉了F。
再刷board,發現A、E、H都可做。換人,石頭哥繼續敲模板。訓哥接過他的菜數學題E,無
奈說了好多次不會做……囧。不管了,于是我拉他過來小討論了下A,發現真的挺水,就敲
了,就過了……
剩下E、H。E是數學題,我想還是訓哥繼續糾結一下吧。H是明顯的費用流,我想好建圖后
,上模板,直接又過掉……看來今天我的手風還是挺好的。
E嘛,訓哥還在說不會做……囧,好奇怪,我推了下居然好像就推出來了,又不管了,搶過
機器,試了下,發現樣例都錯了,改了下,就過掉了……
此時5題,全是1AC,華麗了……
期間,石頭哥的C交了,然后錯了。叫他加上判重點、共線、共面后,還是不過……無奈之
下,訓哥作為解放出來的生產力,去敲I了,說不想浪費機時,先敲個輸入輸出。
石頭哥說應該C沒錯的呀,但還是先放下了C,接過訓哥給的G,說好像半平面交能做……我
對著石頭哥C的程序和石頭模板,發現真的沒敲錯,不過有個新加的判共線的地方很詭異,
問之,石頭哥說傻B了,一改,救過了C,搞了這么久的C終于過掉了……石頭哥狀態不佳啊
,囧。
6題在手,但比賽時間還有好多好多,此時成績并不足夠。
到了后期,訓哥一直在糾結I,說之前一直在研究這個數值積分,應該沒問題的啦,但還是
過不了……換模板,發現模板上的精度更水,就又繼續埋頭糾結了。
其實我一早就接過訓哥的J,但想起上次百度之星寫過一個類似的當時寫得我很糾結的單調
性DP,馬上就頹了……石頭哥說可以四邊形不等式優化一下,發現還是TLE,然后我就不得
不重溫上次的悲劇了,一邊手寫J的單調性DP,時不時一邊看看石頭哥的G。
話說石頭哥和訓哥討論后,拿出算法導論,發現G可以差分約束,然后猛男般地上去敲G…
…改了幾個小bug,加了一個優化后,就神奇地過了G,無敵了……
訓哥的I在最后不知道怎么根據函數的特點改變了積分的方法就過掉了,同樣離奇……
比賽結束,我的J,寫到最后調出樣例和幾個水數據之后一直交不過。我的錯,小悲劇了…
…
總體,中大的三個隊成績都挺滿意。三隊Vermoth第四,我們四隊Vodka第五,都金了,六
隊波本也銀了,很好!
下一站,杭州,坐等送死。
--
又是鍛煉匯編能力的訓練。發現自己在每次寫匯編程序之前都不知道基本的代碼模式...具體的實現倒不是很難,只是剛開始的時候由于不知道基本模式浪費了一些時間。
1.步進電機控制應用程序設計
.MODEL SMALL
.STACK
.DATA
PORT DW 0E460H
WELCOME DB 'welcome to my programme,please make choice',0DH,0AH,'$'
OP1 DB '1.clockwise',0DH,0AH,'$'
OP2 DB '2.counter-clockwise',0AH,0DH,'$'
OP3 DB '3.exit',0AH,0DH,'$'
OP DB 'input your choice:','$'
TEM DB '?'
.CODE
SHOWMENU PROC NEAR
PUSH AX
MOV DX,OFFSET WELCOME
MOV AH,09H
INT 21H
MOV DX,OFFSET OP1
INT 21H
MOV DX,OFFSET OP2
INT 21H
MOV DX,OFFSET OP3
INT 21H
MOV DX,OFFSET OP
INT 21H
POP AX
RET
SHOWMENU ENDP

DELAY PROC NEAR
PUSH DX
PUSH BX
MOV DX,0FFFH
T2:
MOV BX,5FFFH
T1:
DEC BX
JNZ T1
DEC DX
JNZ T2
POP BX
POP DX
RET
DELAY ENDP

.startup
MOV AX,@DATA
MOV DS,AX
ABC:
CALL SHOWMENU

MOV AH,01H ;input one char
INT 21H
PUSH AX
MOV AH,02H
MOV DL,0AH
INT 21H
MOV DL,0DH
INT 21H
POP AX

CMP AL,'1'
JZ OPTION1
CMP AL,'2'
JZ OPTION2
CMP AL,'3'
JZ EXIT

OPTION1:
MOV DX,PORT
MOV AL,33H
MOV CX,100
AGAIN:
OUT DX,AL
CALL DELAY
ROL AL,1
LOOP AGAIN
JMP ABC
OPTION2:
MOV DX,PORT
MOV AL,33H
MOV CX,100
AGAIN2:
OUT DX,AL
CALL DELAY
ROR AL,1
LOOP AGAIN2
JMP ABC
EXIT:
.EXIT 0
END

2.溫度測量與控制應用程序設計
.model small
.stack
.data
ten db 0AH
port1 dw 0E460H
port2 dw 0E480H
heat db 0ffh
cool db 00h
wel db 'welcome to my programme',0dh,0ah,'$'
op1 db '1.heat the device',0ah,0dh,'$'
op0 db '0.exit to dos',0ah,0dh,'$'
warn db '----->>>>>>warnning:if the TEMP is over 70,it will be cut off',0ah,0dh,'$'
chioce db 'choice:','$'

.code

show proc near
push dx
push ax
mov ah,09h
mov dx,offset wel
int 21h
mov dx,offset op1
int 21h
mov dx,offset op0
int 21h
mov dx,offset warn
int 21h
mov dx,offset chioce
int 21h
pop ax
pop dx
ret
show endp
delay proc near
push dx
push bx
mov dx,5fffh
T2:
mov bx,5fffh
T1:
dec bx
jnz T1
dec dx
jnz T2
pop bx
pop dx
ret
delay endp
change proc near;interface ax
push ax
push dx
div ten
mov dh,00h
mov dl,ah
push dx
mov ah,0
div ten
mov dh,00H
mov dl,ah
push dx
pop dx
add dx,30h
mov ah,02h
int 21h
pop dx
add dx,30h
int 21h
mov dl,0ah
int 21h
mov dl,0dh
int 21h

pop dx
pop ax
ret
change endp


.startup
init:
call show


mov dx,port1
mov al,cool
out dx,al

mov ah,01h
int 21h


push ax
mov ah,02h
mov Dl,0ah
int 21h
mov Dl,0dh
int 21h
pop ax


cmp al,'1'
jnz exit

option1:
mov dx,port2
mov ax,0
out dx,al
call delay
mov dx,port1
mov al,heat
out dx,al
again:
mov dx,port2
mov ax,0
out dx,al
mov dx,port2
in al,dx
call delay

mov ah,0
call change
cmp al,70
ja init
mov ah,01h
int 16h
jnz init


jmp again





exit:
.exit 0
end
