题目描述
有一个 n \times mn×m 的棋盘,在某个点 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。
输入格式
输入只有一行四个整数,分别为 n, m, x, y。
输出格式
一个 n×m 的矩阵,代表马到达某个点最少要走几步(左对齐,宽 5 格,不能到达则输出 −1)。
输入输出样例
输入 #1复制
3 3 1 1
输出 #1复制
0 3 2 3 -1 1 2 1 4
说明/提示
测试范围有400,所以用dfs的话很容易时间超限,还要增加其他判断条件
数据规模与约定
对于全部的测试点,保证 1≤x≤n≤400,1≤y≤m≤400。
约束条件:
1.走过的点不走 2.端点3.步数限制
#include<iostream> using namespace std; int x,y,n,m; int a[405][405],vis[405][405]= {0},b[405][405]; void dfs(int x,int y,int step) { int next[8][2]= {{1,2},{1,-2},{-1,2},{-1,-2},{2,1},{2,-1},{-2,1},{-2,-1}}; step++; if(step>250)//由于范围只有400,所以马走的步数几乎不会超过250 return ; if(step<a[x][y]) a[x][y]=step;//取马到达该点的最小步数 else return ;//降低时间复杂度 vis[x][y]=1; int nx,ny; int i; for(i=0; i<8; i++) { nx=x+next[i][0]; ny=y+next[i][1]; if(nx>=0&&nx<n&&ny>=0&&ny<m)//边界 { if(vis[nx][ny]==0)//判断是否走过 { dfs(nx,ny,step); } } } vis[x][y]=0; } int main() { int i,j; for( i=0;i<400;i++) for( j=0;j<400;j++) a[i][j]=99999999; scanf("%d%d%d%d",&n,&m,&x,&y); dfs(x-1,y-1,-1); for(i=0; i<n; i++) { for(j=0; j<m; j++) { if(x-1==i&&y-1==j) printf("0 ");//起始位置步数为0 else if(a[i][j]==99999999) printf("-1 "); else printf("%-5.d",a[i][j]); } printf("\n"); } return 0; }
最后输出结果时,如果未加那个if语句,其起始位置的步数就没有结果
不知道是为什么
题目描述
呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯。大楼的每一层楼都可以停电梯,而且第ii层楼(1 \le i \le N)(1≤i≤N)上有一个数字K_i(0 \le K_i \le N)Ki(0≤Ki≤N)。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如:3, 3 ,1 ,2 ,53,3,1,2,5代表了K_i(K_1=3,K_2=3,…)Ki(K1=3,K2=3,…),从11楼开始。在11楼,按“上”可以到44楼,按“下”是不起作用的,因为没有-2−2楼。那么,从AA楼到BB楼至少要按几次按钮呢?
输入格式
共二行。
第一行为33个用空格隔开的正整数,表示N,A,B(1≤N≤200, 1≤A,B≤N)N,A,B(1≤N≤200,1≤A,B≤N)。
第二行为NN个用空格隔开的非负整数,表示K_iKi。
输出格式
一行,即最少按键次数,若无法到达,则输出-1−1。
输入输出样例
输入 #1复制
5 1 5 3 3 1 2 5
输出 #1复制
3
#include<stdio.h> int x,mm=100000; int a[205],n,s,step=0,p=0,k,vis[205]= {0}; void dfs(int s,int x,int step) { if(s==x) { if(mm>step) { mm=step;//使得mm为到达目标位置的最小步数 return ; } } if(mm<=step) return ;//减小时间复杂度,未加该步骤会时间超限 if(s!=x) { if(s+a[s]<=n&&vis[s+a[s]]==0)//判断要抵达的楼层是否曾经到过 { vis[s]=1; step++; dfs(s+a[s],x,step); vis[s]=0; } } if(s!=x) { if(s-a[s]>=1&&vis[s-a[s]]==0) { vis[s]=1; step++; dfs(s-a[s],x,step); vis[s]=0; } } return ; } int main() { scanf("%d%d%d",&n,&s,&x); int i; for(i=1; i<=n; i++) { scanf("%d",&a[i]); } dfs(s,x,step); if(mm==100000)//说明到达不了 printf("-1\n"); else printf("%d",mm); }
今天,看了一会儿背包问题,尝试写了bfs的代码,结果在定义栈的位置就报错了