| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2216 人关注过本帖
标题:BFS迷宫
只看楼主 加入收藏
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
结帖率:79.37%
收藏
已结贴  问题点数:20 回复次数:14 
BFS迷宫
题目:http://www.
我利用队列实现,但是不管怎么输入输出都是No Answer!请各位高手帮我看看
#include <stdio.h>
#include <stdlib.h>
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
int ans=0;
int judge(int x,int y,int n,int m,int map[100][100])
{
    if(x>=0&&x<n&&y>=0&&y<m&&map[x][y]==0)
    return 1;
    return 0;
}
void dfs(int map[100][100],int n,int m,int startx,int starty,int endx,int endy)
{
    int queue[1000][3];
    int head=0,tail=1,x,y,xx,yy,i;
    queue[0][0]=startx;queue[0][1]=starty;
    queue[0][3]=0;
    while(head<tail)
    {
    head++;
    x=queue[head][0];
    y=queue[head][1];
    ans=queue[head][3];
    for(i=0;i<4;i++)
    {
    xx=x+dx[i];
    yy=y+dy[i];
    if(judge(xx,yy,n,m,map)==1)
    {
    tail++;
    queue[tail][0]=xx;
    queue[tail][1]=yy;
    queue[tail][3]=ans++;
    }
    }
    if(xx==endx&&yy==endy)
    printf("%d\n",ans);
    }
    printf("No Answer\n");
}
int main()
{
    int map[100][100],n,m,startx,starty,endx,endy;
    int i,j;
    scanf("%d %d",&n,&m);
    for(i=0;i<n;i++)
    for(j=0;j<m;j++)
    scanf("%d",&map[i][j]);
    scanf("%d %d",&startx,&starty);
    scanf("%d %d",&endx,&endy);
    startx--;starty--;
    endx--;endy--;
    dfs(map,n,m,startx,starty,endx,endy);
    system("pause");
    return 0;
}
搜索更多相关主题的帖子: return 
2011-04-23 09:21
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-04-23 15:05
我菜119
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:938
专家分:1756
注 册:2009-10-17
收藏
得分:0 
sunyh1999大哥的代码风格写成这个样式???


愿用余生致力编程
2011-04-23 15:07
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
收藏
得分:10 
没把访问过的点标记掉,这样不会死循环么??
2011-04-23 16:24
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:10 
我的算法,你替我测试一下吧,我只试了非常简单的例子。
用了回溯,而且代码写的不漂亮,楼主将就着看吧

程序代码:
#include <stdio.h>
#include <string.h>

void find_path(int m[2002][2002], int x, int y, int d) {
    if (m[x][y] == 0 || (m[x][y] > 0 && d < m[x][y])) {
        m[x][y] = d;
        find_path(m, x + 1, y, d + 1);
        find_path(m, x, y + 1, d + 1);
        find_path(m, x - 1, y, d + 1);
        find_path(m, x, y - 1, d + 1);
    }
}

int  map[2002][2002];

int main() {
    int i, j, ans = 2002 * 2002, n, m, s_x, s_y, e_x, e_y;
    memset(map, -1, sizeof(int) * 2002 * 2002);
    scanf("%d %d", &n, &m);
    for (i = 1; i <= n; i++) {
        for (j = 1; j <= m; j++) {
            scanf(" %d", &map[i][j]);
            map[i][j] = -map[i][j];
        }
    }
    scanf(" %d %d %d %d", &s_x, &s_y, &e_x, &e_y);
    map[e_x][e_y] = - 2;

    find_path(map, s_x, s_y, 1);

    if (map[e_x + 1][e_y] > 0 && map[e_x + 1][e_y] < ans) {
        ans = map[e_x + 1][e_y];
    }
    if (map[e_x - 1][e_y] > 0 && map[e_x - 1][e_y] < ans) {
        ans = map[e_x - 1][e_y];
    }
    if (map[e_x][e_y + 1] > 0 && map[e_x][e_y + 1] < ans) {
        ans = map[e_x][e_y + 1];
    }
    if (map[e_x][e_y - 1] > 0 && map[e_x][e_y - 1] < ans) {
        ans = map[e_x][e_y - 1];
    }
    if (ans == 2002 * 2002) {
        printf("No Answer!\n");
    } else {
        printf("%d\n", ans);
    }
    return 0;
}


[ 本帖最后由 voidx 于 2011-4-23 18:42 编辑 ]
2011-04-23 18:28
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
是的,没有标记,所以出现了问题:
#include <stdio.h>
#include <stdlib.h>
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
int visit[2000][2000];
int ans=0;
int judge(int x,int y,int n,int m,int map[2000][2000])
{
    //printf("\n%d %d %d %d ",x+1,y+1,n,m);
    if(x>=0&&x<n&&y>=0&&y<m&&map[x][y]==0&&visit[x][y]==0)
    {
    //printf("%d",map[x][y]);
    visit[x][y]=1;
    return 1;
    }
    return 0;
}
void dfs(int map[2000][2000],int n,int m,int startx,int starty,int endx,int endy)
{
    int queue[40000][3];
    int head=0,tail=1,x,y,xx,yy,i;
    queue[0][0]=startx;queue[0][1]=starty;
    queue[0][2]=0;
    while(head<tail)
    {
    x=queue[head][0];
    y=queue[head][1];
    ans=queue[head][2];
    if(x==endx&&y==endy)
    {
    printf("%d\n",ans);
    return ans;
    }
    head++;
    for(i=0;i<4;i++)
    {
    xx=x+dx[i];
    yy=y+dy[i];
    if(judge(xx,yy,n,m,map)==1)
    {
    queue[tail][0]=xx;
    queue[tail][1]=yy;
    queue[tail][2]=ans+1;
    tail++;
    }
    }
    }
    printf("No Answer!\n");
}
int main()
{
    int map[2000][2000],n,m,startx,starty,endx,endy;
    int i,j;
    scanf("%d %d",&n,&m);
    for(i=0;i<n;i++)
    for(j=0;j<m;j++)
    scanf("%d",&map[i][j]);
    scanf("%d %d",&startx,&starty);
    scanf("%d %d",&endx,&endy);
    startx--;starty--;
    endx--;endy--;
    dfs(map,n,m,startx,starty,endx,endy);
    system("pause");
    return 0;
}

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-04-23 18:30
天使恶魔
Rank: 1
等 级:新手上路
帖 子:2
专家分:2
注 册:2011-4-23
收藏
得分:0 
   
2011-04-23 19:33
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
又做了一道迷宫题:http://acm.hdu.

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-04-24 10:23
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
又出现问题,每次输出都是-1
#include <stdio.h>
#include <stdlib.h>
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
int visit[10][10][10];
int ans=0;
int judge(int x,int y,int n,int m,int map[10][10])
{
    if(x>=0&&x<n&&y>=0&&y<m&&map[x][y]==1)
    return 1;
    return 0;
}
void dfs(int map[10][10],int n,int m,int startx,int starty,int endx,int endy)
{
    int queue[100][4];
    int head=0,tail=1,x,y,xx,yy,step,i;
    memset(queue,0,sizeof(queue));
    queue[0][0]=startx;
    queue[0][1]=starty;
    queue[0][2]=0;
    queue[0][3]=6;
    while(head<tail)
    {
    x=queue[head][0];
    y=queue[head][1];
    step=queue[head][2];
    ans=queue[head][3];
    if(x==endx&&y==endy)
    {
    printf("%d\n",step);
    return step;
    }
    head++;
    for(i=0;i<4;i++)
    {
    xx=x+dx[i];
    yy=y+dy[i];
    if(judge(xx,yy,n,m,map)==1&&queue[head][3]<=1&&visit[xx][yy][ans]==0)
    {
    queue[tail][0]=xx;
    queue[tail][1]=yy;
    queue[tail][2]=step+1;
    queue[tail][3]=ans-1;
    visit[xx][yy][ans]=1;
    tail++;
    }
    else continue;
    if(map[xx][yy]==4&&visit[xx][yy][ans]==0)
    {
    queue[tail][0]=xx;
    queue[tail][1]=yy;
    queue[tail][2]=step+1;
    queue[head][3]=6;
    visit[xx][yy][ans]=1;
    tail++;
    }
    }
    }
    printf("-1\n");
}
int main()
{
    int map[10][10],n,m,startx,starty,endx,endy;
    int i,j;
    memset(map,0,sizeof(map));
    memset(visit,0,sizeof(visit));
    scanf("%d %d",&n,&m);
    for(i=0;i<n;i++)
    for(j=0;j<m;j++)
    {
    scanf("%d",&map[i][j]);
    if(map[i][j]==2)
    startx=i,starty=j;
    if(map[i][j]==3)
    endx=i,endy=j;
    }
    dfs(map,n,m,startx,starty,endx,endy);
    system("pause");
    return 0;
}

[ 本帖最后由 sunyh1999 于 2011-4-24 10:47 编辑 ]

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-04-24 10:44
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
void dfs(int map[10][10],int n,int m,int startx,int starty,int endx,int endy)
{
    int queue[100][4];
    int head=0,tail=1,x,y,xx,yy,step,i;
    memset(queue,0,sizeof(queue));
    queue[0][0]=startx;
    queue[0][1]=starty;
    queue[0][2]=0;
    queue[0][3]=6;
    while(head<tail)
    {
    x=queue[head][0];
    y=queue[head][1];
    step=queue[head][2];
    ans=queue[head][3];
    if(x==endx&&y==endy)
    {
    printf("%d\n",step);
    return step;
    }
    head++;
    for(i=0;i<4;i++)
    {
    xx=x+dx[i];
    yy=y+dy[i];
    if(judge(xx,yy,n,m,map)==1&&queue[head][3]<=1&&visit[xx][yy][ans]==0)    // 如果炸弹不爆炸,那就不许走
    {
    queue[tail][0]=xx;
    queue[tail][1]=yy;
    queue[tail][2]=step+1;
    queue[tail][3]=ans-1;
    visit[xx][yy][ans]=1;
    tail++;
    }
    else continue;    // 下面的 if 永远不会被执行,也就是说,永远不许 Ignatius 将炸弹复位
    if(map[xx][yy]==4&&visit[xx][yy][ans]==0)
    {
    queue[tail][0]=xx;
    queue[tail][1]=yy;
    queue[tail][2]=step+1;
    queue[head][3]=6;
    visit[xx][yy][ans]=1;
    tail++;
    }
    }
    }
    printf("-1\n");
}

结论:楼主与 Ignatius 有着血海深仇,说啥也要炸死他
2011-04-24 14:41
快速回复:BFS迷宫
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.044314 second(s), 9 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved