下面是样例示意图:
输入数据包括五个参数:m,n,x,y,K
其中m和n的范围均为是[1,10],K的范围是[0,10]。
0<=x<m,0<=y<n。
输出成功逃跑的路径数量。
2 3 0 1 2
6
#include <bits/stdc++.h>
using namespace std;
int m, n, x, y, k, ans;
int dx[] = {0, 1, -1, 0};
int dy[] = {1, 0, 0, -1};
bool outside(int x, int y) {
return x < 0 || m <= x || y < 0 || n <= y;
}
void dfs(int x, int y, int k) {
if (k <= 0) return;
for (int i = 0; i < 4; ++i) {
int nx = x + dx[i], ny = y + dy[i];
if (outside(nx, ny)) ++ans;
else dfs(nx, ny, k - 1);
}
}
int main() {
scanf("%d %d %d %d %d", &m, &n, &x, &y, &k);
dfs(x, y, k);
cout << ans << endl;
return 0;
}
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
static int count = 0;
static int[] dx = {-1, 1, 0, 0};
static int[] dy = {0, 0, -1, 1};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int m = Integer.parseInt(br.readLine());
int n = Integer.parseInt(br.readLine());
int x = Integer.parseInt(br.readLine());
int y = Integer.parseInt(br.readLine());
int k = Integer.parseInt(br.readLine());
boolean[][] grid = new boolean[m][n];
dfs(grid, x, y, k);
System.out.println(count);
}
private static void dfs(boolean[][] grid, int x, int y, int rest) {
if(x < 0 || x >= grid.length || y < 0 || y >= grid[0].length){
if(rest >= 0){
count ++; // 合法逃出方案数自增
}
}else{
if(rest > 0){
grid[x][y] = true;
for(int i = 0; i < 4; i++){
dfs(grid, x + dx[i], y + dy[i], rest - 1);
// 回溯
if(0 <= x + dx[i] && x + dx[i] < grid.length && 0 <= y + dy[i] && y + dy[i] < grid[0].length){
grid[x + dx[i]][y + dy[i]] = false;
}
}
}
}
}
} 这道题目就是一个dfs,同时没有说该地鼠走过的路不能再走了。
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main{
static boolean[][] vis;
static int count=0;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str;
str = br.readLine();
// 处理输入
String m=str.trim();
int m1=Integer.parseInt(m);
str=br.readLine();
String n=str.trim();
int n1=Integer.parseInt(n);
str=br.readLine();
String x=str.trim();
int x1=Integer.parseInt(x);
str=br.readLine();
String y=str.trim();
int y1=Integer.parseInt(y);
str=br.readLine();
String k=str.trim();
int k1=Integer.parseInt(k);// 需要用到的步数
int[][] arr=new int[m1][n1];
// 坐标为x1,y1;
arr[x1][y1]=1;
// vis[x1][y1]=true;
dfs(arr,x1+1,y1,k1-1);
dfs(arr,x1-1,y1,k1-1);
dfs(arr,x1,y1+1,k1-1);
dfs(arr,x1,y1-1,k1-1);
System.out.println(count);
}
public static void dfs(int[][] arr,int i,int j,int step){
if(step<0) return;
if((i<0||i>=arr.length||j<0||arr[0].length<=j) ){
if(step>=0){
count++;
}
return;
}
// if(arr[i][j]==1) return;
// arr[i][j]=1;
dfs(arr,i+1,j,step-1);
dfs(arr,i-1,j,step-1);
dfs(arr,i,j+1,step-1);
dfs(arr,i,j-1,step-1);
// arr[i][j]=0;
}
}
import java.util.Scanner;
public class Main {
public int countPath(int m, int n, int x, int y, int k) {
if (!(x>=0 && x<m && y>=0 && y<n)) // 逃出
return 1;
else if (k == 0) // 在范围内,但步数已经为0,返回0
return 0;
return countPath(m,n,x+1,y,k-1) + countPath(m,n,x-1,y,k-1) +
countPath(m,n,x,y+1,k-1) + countPath(m,n,x,y-1,k-1);
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
Main main = new Main();
while(in.hasNextInt()) {
int m = in.nextInt();
int n = in.nextInt();
int x = in.nextInt();
int y = in.nextInt();
int k = in.nextInt();
System.out.println(main.countPath(m,n,x,y,k));
}
}
}
|
#include<bits/stdc++.h>
using namespace std;
int f(int m, int n, int x, int y, int k) {
if (k==0 && x>=0&&x<m && y>=0&&y<n) {
return 0;
}
// yuejie
if (x<0 || x>=m || y<0 || y>=n) {
return 1;
}
// k > 0
int ans = 0;
ans += f(m, n, x-1, y, k-1);
ans += f(m, n, x+1, y, k-1);
ans += f(m, n, x, y-1, k-1);
ans += f(m, n, x, y+1, k-1);
return ans;
}
int main() {
int m,n,x,y,k;
cin>>m>>n>>x>>y>>k;
cout << f(m,n,x,y,k) << endl;
return 0;
} #include <iostream>
#include <iomanip>
#include <algorithm>
#include <string>
#include <list>
#include <math.h>
#include <set>
#include <cstdio>
#include <queue>
#include <sstream>
#include <stack>
//#define DBL_MAX 1.7976931348623158e+308
using namespace std;
typedef long long ll;
#define BIG 1000000000
//习惯性带上上面
int f(int m, int n, int x, int y, int k) {
if (x < 0 || y < 0 || x >= n || y >= m) {
return 1;
}
if (k <= 0) {
return 0;
}
return f(m, n, x + 1, y, k - 1) + f(m, n, x - 1, y, k - 1) + f(m, n, x, y + 1, k - 1) + f(m, n, x, y - 1, k - 1);
}
int main() {
int m, n, x, y, k;
cin >> m >> n >> y >> x >> k;
cout << f(m, n, x, y, k) << endl;
return 0;
}
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int m = scan.nextInt();
int n = scan.nextInt();
int x = scan.nextInt();
int y = scan.nextInt();
int k = scan.nextInt();
boolean[][] flags = new boolean[m][n];
int res;
res = helper(m, n, x, y, k, 0);
System.out.println(res);
scan.close();
}
private static int helper(int m, int n, int x, int y, int k, int step) {
int count = 0;
// 如果超出了步数,那么直接返回0
if (k < step)
return 0;
// 已经在外边,那么直接返回
if (x < 0 || x >= m || y < 0 || y >= n){
return 1;
}
int up = helper(m, n, x - 1, y, k, step + 1);
int down = helper(m, n, x + 1, y, k, step + 1);
int left = helper(m, n, x, y - 1, k, step + 1);
int right = helper(m, n, x, y + 1, k, step + 1);
// 所有的数量为上下左右之和
count += (up + right + left + down);
return count;
}
} #include<iostream>
using namespace std;
int func(int x, int y,int K,int m,int n)
{
int up = 0, down = 0, left = 0, right = 0, sum = 0;
if (K == 0)
return 0;
if (x==0)//向上
up = 1;
else
up = func(x - 1, y, K - 1, m, n);
if (x == m - 1)//向下
down = 1;
else
down = func(x + 1, y, K - 1, m, n);
if (y == 0)//向左
left = 1;
else
left = func(x, y - 1, K - 1, m, n);
if (y == n - 1)//向右
right = 1;
else
right = func(x, y + 1, K - 1, m, n);
sum = up + down + left + right;
return sum;
}
int main()
{
int m = 0, n = 0, x = 0, y = 0, K = 0;
cin >> m;
cin >> n;
cin >> x;
cin >> y;
cin >> K;
cout << func(x, y, K, m, n);
} #include <iostream>
using namespace std;
int m,n,x,y,k,ans;
void solve(int h,int i,int j){
if(h>k) //超过步数
return;
else if(i>=m||i<0||j>=n||j<0) //走出田地范围
ans++;
else{
solve(h+1,i-1,j); //上
solve(h+1,i+1,j); //下
solve(h+1,i,j-1); //左
solve(h+1,i,j+1); //右
}
}
int main(){
cin>>m>>n>>x>>y>>k;
solve(0,x,y);
cout<<ans;
return 0;
} 需要额外注意的是,上下左右是四种情形,不能合并处理。刚开始if合起来判断了,总是少一点
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int m, n, k;
void times(int x, int y, int left_times, int &count) {
if (left_times > 0) {
if (x == 0 ) count++;
if (x == m - 1) count++;
if (y == 0 ) count++;
if (y == n - 1) count++;
if (x > 0) times(x - 1, y, left_times - 1, count);
if (x < m - 1)times(x + 1, y, left_times - 1, count);
if (y < n - 1) times(x, y + 1, left_times - 1, count);
if (y > 0) times(x, y - 1, left_times - 1, count);
}
}
int main() {
cin >> m >> n;
int x, y, count = 0;
cin >> x >> y >> k;
times(x, y, k, count);
cout << count;
system("pause");
return 0;
}
""""
BFS或DFS
"""
import sys
from collections import deque
def BFS(m, n, x, y, K):
deq = deque([(x, y, 0)])
ans = 0
while deq:
i, j, k = deq.popleft()
if k >= K: break
if i + 1 >= m:
ans += 1
else:
deq.append((i + 1, j, k + 1))
if i - 1 < 0:
ans += 1
else:
deq.append((i - 1, j, k + 1))
if j + 1 >= n:
ans += 1
else:
deq.append((i, j + 1, k + 1))
if j - 1 < 0:
ans += 1
else:
deq.append((i, j - 1, k + 1))
return ans
if __name__ == "__main__":
# sys.stdin = open("input.txt", "r")
m, n, x, y, K = int(input()), int(input()), int(input()), int(input()), int(input()),
ans = BFS(m, n, x, y, K)
print(ans)
其实就是计算第n步所有边界上的点的和。
矩阵进行k次转移,然后统计和即可。
转移方程直接用周围四个点转移。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<bits/stdc++.h>
using namespace std;
int z[15][15];
int a[15][15];
int main()
{
// freopen("in","r",stdin);
int m,n,x,y,k;
cin>>n>>m>>x>>y>>k;
x++;
y++;
z[x][y]=1;
// k--;
int sum=0;
while(k--){
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
a[i][j]=(z[i-1][j]+z[i+1][j]+z[i][j+1]+z[i][j-1]);
if(i==1){
sum+=z[i][j];
}
if(i==n){
sum+=z[i][j];
}
if(j==1){
sum+=z[i][j];
}
if(j==m){
sum+=z[i][j];
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
z[i][j]=a[i][j];
// cout<<z[i][j]<<' ';
}
// cout<<endl;
}
}
cout<<sum<<endl;
return 0;
}
很简单的DFS
当前坐标、步数对应的路径总数 = 当前方格能1步出田地的路径数 + 上下左右步数+1时出田地的路径数
#include
using namespace std;
int dfs(int i, int j, const int& row, const int& col, int step, const int& K){
int now = 0;
if(step==K) //K步之后还在田地里
return 0;
if(i==0)
++now;
if(j==0)
++now;
if(i==row-1)
++now;
if(j==col-1)
++now;
int up,down,left,right;
up = down = left = right = 0;
if(i>0)
up = dfs(i-1,j,row,col,step+1,K);
if(i<row-1)
down = dfs(i+1,j,row,col,step+1,K);
if(j>0)
left = dfs(i,j-1,row,col,step+1,K);
if(j<col-1)
right = dfs(i,j+1,row,col,step+1,K);
return now+up+down+left+right;
}
int main(){
int m,n,x,y,K;
cin>>m>>n>>x>>y>>K;
int result = dfs(x,y,m,n,0,K);
cout<<result<<endl;
return 0;
}
import java.util.Scanner;
public class Main {
static int m;
static int n;
static int K;
public static void main(String[] args) {
//输入数据包括五个参数:m,n,x,y,K
Scanner scanner = new Scanner(System.in);
m = scanner.nextInt();
n = scanner.nextInt();
int x = scanner.nextInt();
int y = scanner.nextInt();
K = scanner.nextInt();
System.out.println(fun(x,y,0));
}
static int fun(int x,int y,int step){
if (step>K)
return 0;
if (x<0||y<0||x>=m||y>=n)
return 1;
return fun(x-1,y,step+1)+fun(x+1,y,step+1)+fun(x,y-1,step+1)+fun(x,y+1,step+1);
}
}
#include <bits/stdc++.h>
using namespace std;
int m,n,k;
int DFS(int x, int y, int s){
int sum=0;
if(s==k)
return 0;
if(x==0)
sum++;
if(y==0)
sum++;
if(x==m-1)
sum++;
if(y==n-1)
sum++;
if(x>0)
sum += DFS(x-1,y,s+1);
if(x<m-1)
sum += DFS(x+1,y,s+1);
if(y>0)
sum += DFS(x,y-1,s+1);
if(y<n-1)
sum += DFS(x,y+1,s+1);
return sum;
}
int main(){
int x,y;
cin>>m>>n>>x>>y>>k;
cout<<DFS(x,y,0)<<endl;
return 0;
} package main
import (
"fmt"
)
func main() {
var m,n,x,y,k int
fmt.Scan(&m,&n,&x,&y,&k)
ans:=0
var dfs func(int,int,int)
dfs=func(i,j int,tot int){
if tot>k{
return
}
if (i<0||i>=m||j<0||j>=n)&&tot<=k{
ans++
return
}
tot++
dfs(i+1,j,tot)
dfs(i-1,j,tot)
dfs(i,j+1,tot)
dfs(i,j-1,tot)
}
dfs(x,y,0)
fmt.Print(ans)
} import sys # for line in sys.stdin: # a = line.split() # print(int(a[0]) + int(a[1])) para = [] for i in range(5): num = int(input()) para.append(num) row, col = para[0], para[1] start = (para[2], para[3]) K = para[-1] tian = [[0]*3 for _ in range(row)] res = [] temp = [] def func(start, K): global res, tian, temp m, n = start if ((m<0&nbs***bsp;m>=row)&nbs***bsp;(n<0&nbs***bsp;n>=col) and K>=0): res.append(temp.copy()) return K -= 1 if K<0: return temp.append(start) func((m+1, n), K) func((m-1, n), K) func((m, n-1), K) func((m, n+1), K) temp.pop() K += 1 func(start, K) print(len(res))