1894 985的方格難題

2021-07-16 03:25:24 字數 1475 閱讀 5589

time limit: 1 sec  

memory limit: 128 mb

submit: 325  

solved: 59

submit

status

web board

985走入了乙個n * n的方格地圖,他已經知道其中有乙個格仔是壞的。現在他要從(1, 1)走到(n, n),每次只可以向下或者向右走一步,問他能否到達(n,n)。若不能到達輸出-1,反之輸出到達(n,n)的方案數。

第一行輸入乙個整數t,代表有t組測試資料。

每組資料第一行輸入三個整數n,x,y,分別代表方格地圖的大小以及壞掉格仔的位置。

注:1 <= t <= 20,1 <= n <= 30,1 <= x,y <= n。

若可以到達(n,n)則輸出方案數對1e9 + 7取餘的結果,反之輸出-1。

22 1 22 2 2

1-1hpu

解題思路:從(1,1)到達(n,n)有兩種情況,1:不經過(x,y);2:經過(x,y)。所以要求從(1,1)出發不經過(x,y)到達(n,n)的方法數,用從(1,1)到達(n,n)的方法數減去從(1,1)出發經過(x,y)到達(n,n的方法數即可)。

從(1,1)無障礙到達(n,n)的方法數,可有規律:

如n等於5,

每個格仔裡面的數字是從(1,1)到達該格仔的方法數,可發現,除了第一列和第一行,每個數都等於它上面的數和左邊的數之和,於是打錶能得到從(1,1)到達每個點的方法數。設陷阱的座標為(x,y),那麼從(1,1)到(x,y)的方法數s1可在圖中找出,而(x,y)到(n,n)的方法數s2可以將(x,y)當做(1,1),(n,n)轉化成相對座標,那麼從(x,y)到(n,n)的方法數也求了出來,s1*s2即為從(1,1)經過(x,y)到(n,n)的方法總數,然後用map【n】【n】-s1*s2即可。

**如下:

#include #define mod 1000000007  

long long n,x,y;

long long map[31][31];

int main()

for(int i=1;i<31;i++)

for(int i=2;i<31;i++)

} int t;

scanf("%d",&t);

while(t--)

if(x==1&&y==1)//出發點為壞格仔,那麼也無法走

long long ans=map[n][n]-map[x][y]*map[n-x+1][n-y+1];//第乙個map是方法總數,第二個map是從出發點到(x,y)的方法數,第三個map是從(x,y)到(n,n)的方法數。

printf("%lld\n",ans%mod);//注意取模

} return 0;

}

1894 985的方格難題

time limit 1 sec memory limit 128 mb submit 325 solved 59 submit status web board 985走入了乙個n n的方格地圖,他已經知道其中有乙個格仔是壞的。現在他要從 1,1 走到 n,n 每次只可以向下或者向右走一步,問他能...

zzulioj 1894 985的方格難題

time limit 1 sec memory limit 128 mb submit 375 solved 78 submit status web board 985走入了乙個n n的方格地圖,他已經知道其中有乙個格仔是壞的。現在他要從 1,1 走到 n,n 每次只可以向下或者向右走一步,問他能...

zzuli 1894 (985的方格難題)

dp 985的方格難題 985走入了乙個n n的方格地圖,他已經知道其中有乙個格仔是壞的。現在他要從 1,1 走到 n,n 每次只可以向下或者向右走一步,問他能否到達 n,n 若不能到達輸出 1,反之輸出到達 n,n 的方案數。第一行輸入乙個整數t,代表有t組測試資料。每組資料第一行輸入三個整數n,...