标签:acm
求从左上角到右下角的最短路径,1是路,2是墙,只可以前后左右的走。dfs:
#include<cstdio>
#include<cstring>
using namespace std;
int maze[5][5];
int ans;
bool vis[5][5];
const int dir[4][2]={0,1,0,-1,1,0,-1,0};
struct node{
int x,y;
} way[30],best[30];
void dfs(int nodex, int nodey, int deep){
int x,y;
if(nodex==4&&nodey==4&&deep<ans){
ans=deep;
for(int i=0;i<ans;i++){
best[i].x=way[i].x;
best[i].y=way[i].y;
}
}
for(int i=0;i<4;i++){
x=nodex+dir[i][0];
y=nodey+dir[i][1];
if(x<0||y<0||x>4||y>4||maze[x][y]==1||vis[x][y]==true)
continue;
else{
vis[x][y]=true;
way[deep].x=x;
way[deep].y=y;
dfs(x,y,deep+1);
vis[x][y]=false;
}
}
}
int main(){
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
scanf("%d",&maze[i][j]);
}
}
ans=1000;
memset(way,0,sizeof(way));
memset(best,0,sizeof(best));
memset(vis,false,sizeof(vis));
way[0].x=0;
way[0].y=0;
vis[0][0]=true;
dfs(0,0,1);
for(int i=0;i<ans;i++){
printf("(%d, %d)\n",best[i].x,best[i].y);
}
return 0;
}
bfs:
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
int step[5][5],maze[5][5];
bool vis[5][5];
int dir[4][2]={1,0,-1,0,0,1,0,-1};
struct node{
int x;
int y;
node(int _x,int _y):x(_x),y(_y){}
};
queue<node> q;
void bfs(){
node start(0,0);
q.push(start);
vis[0][0]=true;
while(!q.empty()){
node head=q.front();
q.pop();
for(int i=0;i<4;i++){
node next(head.x+dir[i][0],head.y+dir[i][1]);
if(next.x<0||next.x>4||next.y<0||next.y>4||(vis[next.x][next.y]==true)||(maze[next.x][next.y]==1)){
continue;
}
else{
q.push(next);
step[next.x][next.y]=step[head.x][head.y]+1;
vis[next.x][next.y]=true;
}
if(next.x==4&&next.y==4)
return;
}
}
}
int main(){
memset(step,0,sizeof(step));
memset(vis,false,sizeof(vis));
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
scanf("%d",&maze[i][j]);
}
}
bfs();
int cnt=0;
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
if(step[i][j]==cnt){
printf("(%d, %d)\n",i,j);
cnt++;
}
}
}
return 0;
}
最后读取路线的时候,因为是从左上到右下,所以循环读取到第一个符合cnt值的地方就是最佳路径。
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
if(step[i][j]==cnt){
printf("(%d, %d)\n",i,j);
cnt++;
}
这里本来我写的是:
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
if(step[i][j]==cnt++){
printf("(%d, %d)\n",i,j);
}
注意看后发现每次循环后面的写法都会导致cnt增加,最后结果出错。
标签:acm
原文地址:http://blog.51cto.com/13688928/2106736