1樓:網友
嗯,既然你都知道用bfs了,那證明你也對它有所掌握。
其實,你可稿李簡以這樣處理,棋盤的邊界,你可以在原棋盤的外圍再加上一圈邊界,用個二維的布林型陣列變數來模擬棋盤情況,而那些有障礙物的地方,也可以想邊界一樣標識出來。
然後就是bfs的實現,由於n最大隻有100,你可以直接開乙個100000的陣列作為佇列擾告,沒必鍵褲要用迴圈佇列搞複雜了。而且bfs的結果就是最優解,搜出來的結果就是答案。
兄弟,這下知道怎麼做了嗎?
pascal跳馬問題..
2樓:網友
畫外音:你需要**麼?有時間限制嗎?
高手幫忙看一下我的pascal跳馬程式
3樓:網友
問題一:1、檢查常量b、c陣列的資料是否有錯;2、回溯程式中確保每走一步都做了標記,返回時是否恢復標記。
問題二:1、因為馬永遠向右走,那幅圖馬第一步走到(2,y),那麼無論在怎麼走,x座標都不會小於二,因而不會走重複。所以沒有做標記的必要;
2、想像一下,用陣列表示點,如圖,兩個紅點的座標(3,3)(7,1),實際上也可以把他們看作是點。。。和綠點的座標是乙個道理。。
pascal高手請進!樹得遍歷問題
4樓:網友
其實我不知道 你的題目想表達點什麼。
我是按從左往右從上到下輸入樹的。
type...ptreedata=^ttreedata;
..ttreedata=record
..data:integer;
..left,right:ptreedata;
..end;
.//前。procedure walktree1(tree:ptreedata);
begin..if(tree<>nil) then
..begin
..writeln(tree^.data);
..walktree(tree^.left);
..walktree(tree^.right);
..end;
end;.中。procedure walktree2(tree:ptreedata);
begin..if(tree<>nil) then
..begin
..walktree(tree^.left);
..writeln(tree^.data);
..walktree(tree^.right);
..end;
end;後。
procedure walktree(tree:ptreedata);
begin..if (tree <>nil) then
..begin
..walktree(tree^.left);
..walktree(tree^.right);
..writeln(tree^.data);
..end;
end;. tree:ptreedata);;
..begin
..if tree=nil then.
..begin
..read(x);
..if x=0 then exit;
..new(p);
..tree^.data:=x;
..tree^.left:=nil;tree^.right:=nil;
..build(tree^.left);
..build(tree^.right);
..end;
..end;.
begin..buildtree(t);
.treewalk1(t);
.treewalk2(t);
.treewalk3(t);
end;
pascal問題
5樓:
10^5那麼小,廣度優先遍歷。
upgrade---
好吧說bfs算是我敷衍了。這個其實是spfa.這題其實可以看成圖論。
var k,t,x,y,head,tail:longint;
queue,distant:array[1..100010]of longint;
hash:array[1..100010]of boolean;
beginfor i:=1 to 100010 dodistant[i]:=1000000;
readln(x,y);
distant[x]:=0;
queue[1]:=x;
hash[x]:=true;
head:=0;
tail:=1;
repeat
inc(head);
hash[head]:=false;
k:=distant[queue[head]];
if(queue[head]=y)then beginwriteln(k);
break;
end;if(queue[head]>1)then begint:=queue[head]-1;
if(distant[t]>k+1)then begindistant[t]:=k+1;
if(not hash[t])then begininc(tail);
queue[tail]:=t;
hash[t]:=true;
end;end;
end;if(queue[head]<100000)then begint:=queue[head]+1;
if(distant[t]>k+1)then begindistant[t]:=k+1;
if(not hash[t])then begininc(tail);
queue[tail]:=t;
hash[t]:=true;
end;end;
end;if(queue[head]shl 1<=100000)then begin
t:=queue[head]shl 1;
if(distant[t]>k+1)then begindistant[t]:=k+1;
if(not hash[t])then begininc(tail);
queue[tail]:=t;
hash[t]:=true;
end;end;
end;until head=tail;
end.
6樓:網友
動態規劃毋庸置疑。
f[i,j]:=min
if i mod 2=0 then if f[i,j]>f[i div 2,j-1]+1 then f[i,j]:=f[i div 2,j-1]+1;
但這個n^2的程式會超時。想不出有什麼優化//f[i,j]是指第i個位置,在第j步的最短時間。
pascal問題
7樓:埌淶霳
10^5那麼小,廣度優先遍歷。
upgrade---
好吧說bfs算是我敷衍了。這個其實是spfa.這題其實可以看成圖論。
var k,t,x,y,head,tail:longint;
queue,distant:array[1..100010]of longint;
hash:array[1..100010]of boolean;
beginfor i:=1 to 100010 dodistant[i]:=1000000;
readln(x,y);
distant[x]:=0;
queue[1]:=x;
hash[x]:=true;
head:=0;
tail:=1;
repeat
inc(head);
hash[head]:=false;
k:=distant[queue[head]];
if(queue[head]=y)then beginwriteln(k);
break;
end;if(queue[head]>1)then begint:=queue[head]-1;
if(distant[t]>k+1)then begindistant[t]:=k+1;
if(not hash[t])then begininc(tail);
queue[tail]:=t;
hash[t]:=true;
end;end;
end;if(queue[head]<100000)then begint:=queue[head]+1;
if(distant[t]>k+1)then begindistant[t]:=k+1;
if(not hash[t])then begininc(tail);
queue[tail]:=t;
hash[t]:=true;
end;end;
end;if(queue[head]shl 1<=100000)then begin
t:=queue[head]shl 1;
if(distant[t]>k+1)then begindistant[t]:=k+1;
if(not hash[t])then begininc(tail);
queue[tail]:=t;
hash[t]:=true;
end;end;
end;until head=tail;
end.
1216跳馬問題
varn,m,x1,y1,x2,y2,i,j longint f array 2.502,2.502 of longint begin readln n,m readln x1,y1 f x1,y1 1 readln x2,y2 for i x1 1 to x2 do for j 1 to m do...
pascal 階乘問題,pascal乘積最大問題
請樓上注意題目描述,只求一位,根本不用高精度。另外,請同志們尊重提問者,認真作答,不要以一兩句話敷衍了事!ps 我是一樓。pascal乘積最大問題 我們一起來分析一下 設字串長度為n,乘號數為k,如果n ,k 時,有 n 種不同的乘法,當k 時,有c , 種乘法,既c k,n 種乘法,當n k稍微...
pascal 棋盤問題 搜尋演算法
你要的是方案還是方案數量。用迴圈並記錄,最後輸出。問題再詳細點,我方便給你做 可能要加上位運算優化。就不給了,我也沒有 棋盤覆蓋問題演算法,pree pascal,幫一下 下面乙個跟noip第十三屆的一模一樣。pascal 棋盤數問題 誰能幫我看下錯在 因為在x 中x是longint型的,可是有 所以...