uva 816 - Abbott's Revenge(有点困难bfs迷宫称号)
是典型的bfs,但是,这个问题的目的在于读取条件的困难,而不是简单地推断,需要找到一种方法来读取条件。还需要想办法去推断每一点不能满足条件,继续往下走。
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<iostream>
#include<algorithm>
using namespace std; struct note
{
int r;
int c;
int dir;
};
string s,s1;
int r0,c0,r1,c1,dir,r2,c2;
int has_edge[10][10][4][3];
int d[10][10][4];
note p[10][10][4];
char dirs[]={'N','E','S','W'};
char turns[]={'F','L','R'};
int dr[]={-1,0,1,0};
int dc[]={0,1,0,-1}; note walk(note u,int turn)
{
note v;
int dirr=u.dir;
if(turn==1) {dirr=(dirr+3)%4;}
if(turn==2) {dirr=(dirr+1)%4;}
v.r=u.r+dr[dirr];
v.c=u.c+dc[dirr];
v.dir=dirr;
return v;
}
bool inside(int x,int y)
{
if(x>=1&&x<=9&&y>=1&&y<=9) return true;
return false;
}
void print_ans(note u)
{
vector<note> vec;
while(1)
{
if(d[u.r][u.c][u.dir]==0) break;
vec.push_back(u);
u=p[u.r][u.c][u.dir];
}
u.r=r0;u.c=c0;u.dir=dir;
vec.push_back(u);
cout<<s1<<endl;
int cnt=0;
for(int i=vec.size()-1;i>=0;i--)
{
cnt++;
if(cnt==1) printf(" ");
printf("(%d,%d)",vec[i].r,vec[i].c);
if(cnt!=10&&i!=0) printf(" ");
if(cnt==10&&i!=0) {printf("\n");cnt=0;}
}
printf("\n");
}
void solve()
{
queue<note> q;
note uu;
uu.r=r0;uu.c=c0;uu.dir=dir;
note u;
u.r=r1;u.c=c1;u.dir=dir;
d[r1][c1][dir]=1;
p[r1][c1][dir]=uu;
d[r0][c0][dir]=0;
q.push(u);
while(!q.empty())
{
u=q.front();
q.pop();
if(u.r==r2&&u.c==c2) {print_ans(u);return;}
for(int i=0;i<3;i++)
{
note v=walk(u,i);
if(has_edge[u.r][u.c][u.dir][i]&&inside(v.r,v.c)&&d[v.r][v.c][v.dir]<0)
{
p[v.r][v.c][v.dir]=u;
d[v.r][v.c][v.dir]=d[u.r][u.c][u.dir]+1;
q.push(v);
}
}
}
cout<<s1<<endl;
printf(" No Solution Possible\n");
} int main()
{
while(cin>>s1)
{
if(s1=="END") break;
memset(has_edge,0,sizeof(has_edge));
memset(d,-1,sizeof(d));
memset(p,0,sizeof(p));
int a,count=0;
int a1,a2,dir1,turn1;
while(cin>>a)
{
if(a==0) break;
count++;
if(count==1)
{
r0=a;
cin>>c0>>s>>r2>>c2;
for(int i=0;i<4;i++)
{
if(s[0]==dirs[i])
{
dir=i;
break;
}
}
r1=r0+dr[dir];
c1=c0+dc[dir];
}
else
{
a1=a;
cin>>a2;
while(cin>>s)
{
if(s[0]=='*') break;
for(int i=0;i<4;i++)
{
if(s[0]==dirs[i])
{
dir1=i;
break;
}
}
for(int i=1;i<s.size();i++)
{
for(int j=0;j<3;j++)
{
if(s[i]==turns[j])
{
turn1=j;
break;
}
}
has_edge[a1][a2][dir1][turn1]=1;
}
}
}
}
// for(int i=1;i<=9;i++)
// {
// for(int j=1;j<=9;j++)
// {
// for(int k=0;k<4;k++)
// {
// for(int l=0;l<3;l++)
// {
// if(has_edge[i][j][k][l])
// printf("[%d][%d][%d][%d]\n",i,j,k,l);
// }
// }
// }
// }
solve();
}
return 0;
}
在解决这道题目的过程中,用到了一些非常好的处理问题的方法,也包括了一些处理问题的小细节,这样的题的解题思想,方法国。还有一些细节要掌握应该有。
版权声明:请注明出处撒...http://blog.csdn.net/u013382399
uva 816 - Abbott's Revenge(有点困难bfs迷宫称号)的更多相关文章
- UVA 816 - Abbott's Revenge(BFS)
UVA 816 - Abbott's Revenge option=com_onlinejudge&Itemid=8&page=show_problem&category=59 ...
- uva 816 abbott's revenge ——yhx
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAncAAAN5CAYAAABqtx2mAAAgAElEQVR4nOy9sY4jydKezVuoayhH0r
- UVA 816 -- Abbott's Revenge(BFS求最短路)
UVA 816 -- Abbott's Revenge(BFS求最短路) 有一个 9 * 9 的交叉点的迷宫. 输入起点, 离开起点时的朝向和终点, 求最短路(多解时任意一个输出即可).进入一个交叉 ...
- uva 816 abbott's revenge ——yhx
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAncAAAN5CAYAAABqtx2mAAAgAElEQVR4nOy9sY4jydKezVuoayhH0r
- UVA 816 Abbott’s Revenge
bfs求最短路,递归打印最短路的具体路径: 难点: 当前状态和转弯方式很复杂,要仔细处理: 递归打印:用一个数组存储路径中结点的前一个节点,递归查找 (bfs无法确定下一个结点,但对于没一个结点,它的 ...
- Uva - 816 - Abbott's Revenge
这个迷宫问题还是挺好玩的,多加了一个转向的问题,有些路口不同的进入方式会有不同的转向限制,这个会比较麻烦一点,所以定义结点结构体的时候需要加一个朝向dir.总体来说是一道BFS求最短路的问题.最后打印 ...
- Uva 816 Abbott's Revenge(BFS)
#include<cstdio> #include<cstring> #include<vector> #include<queue> using na ...
- UVA 816 Abbott's Revenge 紫书
紫书的这道题, 作者说是很重要. 但看着题解好长, 加上那段时间有别的事, 磨了几天没有动手. 最后,这道题我打了五遍以上 ,有两次被BUG卡了,找了很久才找到. 思路紫书上有,就缺少输入和边界判断两 ...
- UVA - 816 Abbott's Revenge(bfs)
题意:迷宫从起点走到终点,进入某点的朝向不同,可以出去的方向也不同,输出最短路. 分析:因为朝向决定接下来在该点可以往哪里走,所以每个点需要有三个信息:x,y,d(坐标和进入该点的朝向),所以将起点的 ...
随机推荐
- Qt webKit可以做什么(四)--实现本地QObject和JavaScript交互
Qt webKit可以做什么(四)--实现本地QObject和JavaScript交互 Qt webKit可以做什么(四)--实现本地QObject和JavaScript交互
- Just another Robbery(背包)
1079 - Just another Robbery PDF (English) Statistics Forum Time Limit: 4 second(s) Memory Limit: 3 ...
- poj1077 Eight【爆搜+Hash(脸题-_-b)】
转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4298840.html ---by 墨染之樱花 题目链接:http://poj.org/pr ...
- innerText和innerHTML的区别
innerhtml用法 innertext用法 以及innerHTML与innertext的区别,看完这个大家以后在实际应用中,就可以选择合适的方法.尽可能的考虑到兼容性. test.innerHTM ...
- C3P0连接池参数解释
<!--acquireIncrement:链接用完了自动增量3个. --> <property name="acquireIncrement">3</ ...
- Phases of translation
Phases of translation--翻译阶段 The C++ source file is processed by the compiler as if the following pha ...
- The Power of Reading——英语学习小技巧之七
This method is "The Power of Reading" and it comes from an article by Dr.Stephen Krashen. ...
- [LeetCode]题解(python):020-Valid Parentheses
题目来源: https://leetcode.com/problems/valid-parentheses/ 题意分析: 这道题输入一段只包括括号的字符串,判断这个字符串是否已经配对.配对的规则是,每 ...
- ajax是怎么发请求的和浏览器发的请求一样吗?cookie
下午设置cookie时出现了个问题 用ajax发的post请求php,在php的方法里设置了cookie,然后在浏览器请求的php里打印cookie值但是一直获取不到cookie的值 分析: 1.aj ...
- hdu1695 GCD
http://acm.hdu.edu.cn/showproblem.php?pid=16951 /** 大意: a<=x<=b , c<= y <= d ,求在此范围内 有多少 ...