一道抓貓,一道捕鼠。(d.pas/c/cpp)
【 題目描述】
流浪貓布滿城市的每乙個角落, 非常影響市容市貌, 作為城市聘請的抓貓者, 你有一種捕捉器, 一定可以捕捉到所有走到裡面的貓, 更加幸運的是你有乙個非常厲害的動物心理學家, 他可以**貓在不同位置的行走方向(共有東、 西、 南、 北四種情況)為了節約經費, 問你最少需要多少個捕捉器才能把所有的貓都抓住。
【 輸入格式】
輸入第一行包含兩個整數 n 和 m(1<=n,m<=1000),表示城市被劃分成 n×m 的網格。 接
下來 n 行, 每行包含 m 個字元「 e」、「 w」、「 s」、「 n」 代表東、 西、 南、 北 4 個方向, 表示
當貓在該位置的行走方向, 保證貓不會走出城市區域。
【 輸出格式】
輸出乙個整數表示最少需要的捕捉器數。
【 樣例輸入輸出】
d.in d.out
3 4
swww
sewn
eeen
2 【 資料說明】
40% 1<=n,m<=4
100% 1<=n,m<=1000
【 樣例說明】 捕鼠器放在( 3,4) 點和( 2,2) 點或( 2,3) 點。
貓可以在任意位置,但是他們會按照一定的順序走動,所以他們肯定會走到乙個終點,或者走成乙個環。所以我們直接模擬他們的路徑,將他們走過的路全部連通到乙個集合裡面,即可完成此題。
所以,此題有並查集,廣搜,深搜等多種解法,我使用廣搜寫的,(廣搜相對較為繁瑣)。
#include
#include
#include
using namespace std;
int i,j,k,n,m,tot,ans,head,tail;
int vis[1005][1005];
char map[1005][1005];
struct nodeq[1000005];
int main()
}for(register int i=0;ifor(register int j=0;jif(map[u1][u2]=='w'&&vis[u1][u2-1]==0)
if(map[u1][u2]=='n'&&vis[u1-1][u2]==0)
if(map[u1][u2]=='e'&&vis[u1][u2+1]==0)
if(vis[u1-1][u2]==0&&map[u1-1][u2]=='s')
if(vis[u1+1][u2]==0&&map[u1+1][u2]=='n')
if(vis[u1][u2-1]==0&&map[u1][u2-1]=='e')
if(vis[u1][u2+1]==0&&map[u1][u2+1]=='w')}}
printf("%d",ans);
return
0;}
(mouse.pas/c/cpp)
【 題目描述】
最近小 h 家鬧鼠災, 弄得小 h 十分惱火。 為了解決老鼠的問題, 小 h 根據老鼠的特點
想出了乙個方法。 假設小 h 的家是乙個 n*n 的格仔, 每個格仔都有一定的食物, 數量在 0
到 100 之間, 經過觀察, 老鼠的窩在( 1, 1) 的位置, 老鼠吃東西有個特點, 到哪個地方,
就把這個地方的食物都吃掉, 而且每次都比上一次吃的食物要多, 因此它們總會有個停止的
地方, 而且, 這些老鼠一次最多可以跳 k 格, 不過只能按 x 軸或 y 軸方向來跳。 現在, 小 h
給出食物的分布, 他想知道乙隻老鼠最多可以吃到多少食物。
【 輸入格式】
第一行,n,(1<=n<=100),k,(0<=k<=n),表示 n*n 的格仔, 老鼠一次最多跳 k 格。
接下來的 n 行, 每行 n 個數, 表示這個方格上的食物數量。
【 輸出格式】
乙個數, 表示乙隻老鼠最多可以吃到的食物。
【 樣例輸入輸出】
mouse.in mouse.out
in:3 1
1 2 5
10 11 6
12 12 7
out:37
【 樣例解釋】
(1,1)->(1,2)->(1,3)->(2,3)->(2,2)->(3,2)
1+2+5+6+11+12=37
這題資料範圍是100(n) 所以整個棋盤點數100*100=10000個。
所以普通的搜尋無法ac,所以此題要用記憶化搜尋,(記憶化搜尋,所以dp肯定是可以的,我寫的就是dp)。
我的方法比較玄學。先將所有格仔轉化成一維陣列,然後按公尺粒數從小到大排序。
因為我們從(1,1)開始走,所以將(1,1)賦值為有答案,答案為(1,1)的公尺粒數。
然後從公尺粒的大小掃,如果在當前公尺粒數的那行或那列有小於此格公尺粒數的格仔,且
當個已被賦值成有值(初始化的時候只有(1,1)賦值成有值,所以可以確保從(1,1)
往後生成),則當前格仔的總值就是那個格仔的值加上本格仔的公尺粒數。當然for一
行一列,要取乙個叫max。最後for一遍整張圖的值,取max,既是答案。
**輔助理解:
#include
#include
#include
#define c c=getchar()
using
namespace
std;
int j,k,n,m,tot,ans,top;
int f[105][105],r[105][105];
struct nodea[10005];
int cmp(node a,node b)
int read()
int maxn(int a,int b)
int minn(int a,int b)
sort(a+1,a+1+top,cmp);r[1][1]=f[1][1];
for(i=1;i<=top;i++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) ans=maxn(ans,r[i][j]);
if(ans==0) ans=f[1][1];
printf("%d",ans);
return
0;}
習題 168 貓捉老鼠
有乙隻很霸道的貓,捉來好多好多老鼠,然後,這只貓就開始開大餐了。但為了顯得它與眾不同,它用了乙個很特別的就餐順序 它先定好步長k,然後它吃掉第1個位置上的,然後再每隔k只再吃乙隻老鼠 一輪結束後,它再次從第1個位置開始繼續吃,直到最後只剩下乙隻老鼠為止。而這最後乙隻老鼠這只貓會放走,因為它不想破壞生...
貓捉老鼠(python)解析
import turtle 海龜庫 import time import random 定義上下左右按鍵內容,此處b為老鼠 def up b.setheading 90 按x y座標算,轉90 b.forward 30 30個畫素 def down b.setheading 270 b.forwar...
貓捉老鼠問題系列(一)
形象化的數學問題,總是引人入勝,這個世界創意還是很重要的。從網上收集了一些貓和老鼠的數學話題,僅供欣賞之。在數軸上,0的位置停著乙個不動的老鼠,1的位置在初始時刻有乙隻貓。貓是可以走動的,每一步在數軸上分別以二分之一的概率或朝著正方向或朝著負方向走1的距離。當貓到達0的位置時,貓就抓到老鼠了,遊戲結...