时间限制:3000 ms | 内存限制:65535 KB
难度:4
- 描述
-
这有一个迷宫,有0~8行和0~8列:1,1,1,1,1,1,1,1,1
1,0,0,1,0,0,1,0,1
1,0,0,1,1,0,0,0,1
1,0,1,0,1,1,0,1,1
1,0,0,0,0,1,0,0,1
1,1,0,1,0,1,0,0,1
1,1,0,1,0,1,0,0,1
1,1,0,1,0,0,0,0,1
1,1,1,1,1,1,1,1,1
0表示道路,1表示墙。
现在输入一个道路的坐标作为起点,再如输入一个道路的坐标作为终点,问最少走几步才能从起点到达终点?
(注:一步是指从一坐标点走到其上下左右相邻坐标点,如:从(3,1)到(4,1)。)
- 输入
- 第一行输入一个整数n(0<n<=100),表示有n组测试数据;
随后n行,每行有四个整数a,b,c,d(0<=a,b,c,d<=8)分别表示起点的行、列,终点的行、列。
- 输出
- 输出最少走几步。
- 样例输入
-
2 3 1 5 7 3 1 6 7
- 样例输出
-
12 11
#include <iostream> #include <cstring> #include <string> #include <climits> using namespace std; int ans[9][9]={ {1,1,1,1,1,1,1,1,1}, {1,0,0,1,0,0,1,0,1}, {1,0,0,1,1,0,0,0,1}, {1,0,1,0,1,1,0,1,1}, {1,0,0,0,0,1,0,0,1}, {1,1,0,1,0,1,0,0,1}, {1,1,0,1,0,1,0,0,1}, {1,1,0,1,0,0,0,0,1}, {1,1,1,1,1,1,1,1,1}, }; const int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; int dp[9][9]; int m1,m2,m3,m4,s; void DFS(int lhs, int rhs,int tmd) { if(ans[lhs][rhs]) return; if((lhs==m3) && (rhs==m4)) { if(s>tmd) s=tmd; return; } ++tmd; ans[lhs][rhs]=1; for(int i=0;i<4;i++) { int t1=lhs+dir[i][0]; int t2=rhs+dir[i][1]; if (t1>=0 && t1<9 && t2>=0 && t2<9) DFS(t1,t2,tmd); } ans[lhs][rhs]=0; } int main() { int n; cin>>n; while(n--) { cin>>m1>>m2>>m3>>m4; s=INT_MAX; DFS(m1,m2,0); cout<<s<<endl; } return 0; }
时间限制:3000 ms | 内存限制:65535 KB
难度:4
- 描述
-
这有一个迷宫,有0~8行和0~8列:1,1,1,1,1,1,1,1,1
1,0,0,1,0,0,1,0,1
1,0,0,1,1,0,0,0,1
1,0,1,0,1,1,0,1,1
1,0,0,0,0,1,0,0,1
1,1,0,1,0,1,0,0,1
1,1,0,1,0,1,0,0,1
1,1,0,1,0,0,0,0,1
1,1,1,1,1,1,1,1,1
0表示道路,1表示墙。
现在输入一个道路的坐标作为起点,再如输入一个道路的坐标作为终点,问最少走几步才能从起点到达终点?
(注:一步是指从一坐标点走到其上下左右相邻坐标点,如:从(3,1)到(4,1)。)
- 输入
- 第一行输入一个整数n(0<n<=100),表示有n组测试数据;
随后n行,每行有四个整数a,b,c,d(0<=a,b,c,d<=8)分别表示起点的行、列,终点的行、列。
- 输出
- 输出最少走几步。
- 样例输入
-
2 3 1 5 7 3 1 6 7
- 样例输出
-
12 11
#include <iostream> #include <cstring> #include <string> #include <queue> using namespace std; typedef struct Node { int lhs,rhs; }Node; const int ans[9][9]={ {1,1,1,1,1,1,1,1,1}, {1,0,0,1,0,0,1,0,1}, {1,0,0,1,1,0,0,0,1}, {1,0,1,0,1,1,0,1,1}, {1,0,0,0,0,1,0,0,1}, {1,1,0,1,0,1,0,0,1}, {1,1,0,1,0,1,0,0,1}, {1,1,0,1,0,0,0,0,1}, {1,1,1,1,1,1,1,1,1}, }; const int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; int dp[9][9]; int visited[9][9]; Node m3; void BFS(Node t) { queue<Node> q; Node tt; q.push(t); while (1) { if((t.lhs==m3.lhs) && (t.rhs==m3.rhs)) break; for(int i=0;i<4;i++) { tt.lhs=t.lhs+dir[i][0]; tt.rhs=t.rhs+dir[i][1]; if (tt.lhs>=0 && tt.lhs<9 && tt.rhs>=0 && tt.rhs<9) if(0==visited[tt.lhs][tt.rhs] && 0==ans[tt.lhs][tt.rhs]) { visited[tt.lhs][tt.rhs]=1; dp[tt.lhs][tt.rhs]=dp[t.lhs][t.rhs]+1; q.push(tt); } } t=q.front(); q.pop(); } } int main() { int n; Node m1; cin>>n; while(n--) { cin>>m1.lhs>>m1.rhs>>m3.lhs>>m3.rhs; memset(dp,0,sizeof(dp)); memset(visited,0,sizeof(visited)); visited[m1.lhs][m1.rhs]=1; BFS(m1); cout<<dp[m3.lhs][m3.rhs]<<endl; } return 0; }
时间: 2024-10-19 01:10:54