问题描述
小鼠a与小鼠b身处一个m×n的迷宫中,如图所示。每一个方格表示迷宫中的一个房间。这m×n个房间中有一些房间是封闭的,不允许任何人进入。在迷宫中任何位置均可沿上,下,左,右4个方向进入未封闭的房间。小鼠a位于迷宫的(p,q)方格中,它必须找出一条通向小鼠b所在的(r,s)方格的路。请帮助小鼠a找出所有通向小鼠b的最短道路。
小鼠的迷宫
编程任务
对于给定的小鼠的迷宫,编程计算小鼠a通向小鼠b的所有最短道路。
数据输入
本题有多组输入数据,你必须处理到EOF为止。
每组数据的第一行有3个正整数n,m,k,分别表示迷宫的行数,列数和封闭的房间数。接下来的k行中,每行2个正整数,表示被封闭的房间所在的行号和列号。最后的2行,每行也有2个正整数,分别表示小鼠a所处的方格(p,q)和小鼠b所处的方格(r,s)。(1≤p,r≤n; 1≤q,s≤m)
结果输出
对于每组数据,将计算出的小鼠a通向小鼠b的最短路长度和有多少条不同的最短路输出。每组数据输出两行,第一行是最短路长度;第2行是不同的最短路数。每组输出之间没有空行。
如果小鼠a无法通向小鼠b则输出“No Solution!”。
输入文件示例
8 8 3
3 3
4 5
6 6
2 1
7 7
输出文件示例
11
96
Original: FJOI2004
BFS入门的时候做的题,好怀念..............
队列保存状态扩展.............................回溯求解数
(我先感动去了,momo~)
以下是代码:
这个是转来的代码:
- #include <stdio.h>
- int count[1001][1001];
- int que[2][1000000][2];
- int main()
- {
- int n,m,k;
- int i,j,x,y,startx,starty,endx,endy,step,flag1,flag2,l[2],tx,ty;
- int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};
- while(scanf("%d %d %d",&n,&m,&k)!=EOF)
- {
- for(i=1;i<=n;i++)
- for(j=1;j<=m;j++)
- count[i][j]=0;
- for(i=1;i<=k;i++)
- {
- scanf("%d %d",&x,&y);
- count[x][y]=-1;
- }
- scanf("%d %d",&startx,&starty);
- scanf("%d %d",&endx,&endy);
- if(startx==endx && starty==endy)
- {
- printf("0/n0/n");
- continue;
- }
- flag1=0;
- l[0]=1;
- l[1]=0;
- que[flag1][0][0]=startx;
- que[flag1][0][1]=starty;
- count[startx][starty]=1;
- step=1;
- while(count[endx][endy]==0)
- {
- flag1=(step+1)%2;
- flag2=step%2;
- if(l[flag1]==0)break;
- for(i=0;i<l[flag1];i++)
- {
- x=que[flag1][i][0];
- y=que[flag1][i][1];
- for(j=0;j<4;j++)
- {
- tx=x+dx[j];
- ty=y+dy[j];
- if(tx<1 || ty<1 || tx>n || ty>m)
- continue;
- if(count[tx][ty]==-1)
- continue;
- if(count[tx][ty]){count[tx][ty]+=count[x][y];continue;}
- else
- {
- que[flag2][l[flag2]][0]=tx;
- que[flag2][l[flag2]][1]=ty;
- l[flag2]++;
- count[tx][ty]+=count[x][y];
- }
- }
- }
- step++;
- l[flag1]=0;
- }
- if(count[endx][endy])
- printf("%d/n%d/n",step-1,count[endx][endy]);
- else
- printf("No Solution!/n");
- }
- return 0;
- }
这个是我自己写的也:
- #include <iostream>
- #include <queue>
- using namespace std;
- #define MAX_MAP_SIZE 101
- #define DISABLE_WAY_SIGN -1
- #define ABLE_WAY_SIGN 0
- struct Point
- {
- int x,y;
- }tmp;
- queue<Point> Queue_Shortest_Way;
- int map[MAX_MAP_SIZE][MAX_MAP_SIZE];
- int dx[4]={-1,0,1,0};
- int dy[4]={0,-1,0,1};
- int n,m;
- int num;
- int sta_x,sta_y,des_x,des_y;
- void find_ways_num(int x,int y)
- {
- int i;
- if(x==sta_x&&y==sta_y){num++;return;}
- for(i=0;i<4;i++)
- if(map[x+dx[i]][y+dy[i]]==map[x][y]-1) find_ways_num(x+dx[i],y+dy[i]);
- }
- int main()
- {
- int i,j,x,y;
- int k;
- while(scanf("%d%d%d",&n,&m,&k)!=EOF)
- {
- memset(map,ABLE_WAY_SIGN,sizeof(map));
- for(i=0;i<=n+1;i++)
- {
- map[i][0]=DISABLE_WAY_SIGN;
- map[i][m+1]=DISABLE_WAY_SIGN;
- }
- for(j=0;j<=m+1;j++)
- {
- map[0][j]=DISABLE_WAY_SIGN;
- map[n+1][j]=DISABLE_WAY_SIGN;
- }
- for(i=0;i<k;i++)
- {
- scanf("%d%d",&x,&y);
- map[x][y]=DISABLE_WAY_SIGN;
- }
- scanf("%d%d%d%d",&sta_x,&sta_y,&des_x,&des_y);
- tmp.x=sta_x;tmp.y=sta_y;
- map[sta_x][sta_y]=1;
- Queue_Shortest_Way.push(tmp);
- while(!Queue_Shortest_Way.empty())
- {
- for(i=0;i<4;i++)
- {
- tmp=Queue_Shortest_Way.front();
- tmp.x+=dx[i];
- tmp.y+=dy[i];
- if(map[tmp.x][tmp.y]==ABLE_WAY_SIGN)
- {
- Queue_Shortest_Way.push(tmp);
- map[tmp.x][tmp.y]=map[Queue_Shortest_Way.front().x][Queue_Shortest_Way.front().y]+1;
- }
- }
- Queue_Shortest_Way.pop();
- }
- num=0;
- if(map[des_x][des_y]==0)printf("No Solution!/n");
- else
- {
- find_ways_num(des_x,des_y);
- printf("%d/n",map[des_x][des_y]-1);
- printf("%d/n",num);
- }
- }
- return 0;
- }