uva816 Abbott's Revenge(bfs 模拟代码题)
2016-01-18 22:41
218 查看
锻炼打代码的能力....
#include<bits/stdc++.h>
const int inf=0x7fffffff;
using namespace std;
struct Node{
int x,y,dir;
};
int dir;
int has_edge[10][10][5][4],d[10][10][5],r0,r1,r2,c0,c1,c2;
Node p[10][10][5];
const char* dirs="NESW";
const char* turns="FLR";
int dir_id(char c){return strchr(dirs,c)-dirs;}
int turn_id(char c){return strchr(turns,c)-turns;}
const int nxt[4][2]={-1,0,0,1,1,0,0,-1};
Node walk(const Node &u,int turn)
{
int dir=u.dir;
if(turn==1) dir=(dir+3)%4;
if(turn==2) dir=(dir+1)%4;
return Node{u.x+nxt[dir][0],u.y+nxt[dir][1],dir};
}
bool inside(int x,int y){
return (x>=1&&y>=1&&x<=9&&y<=9);
}
void print(Node u)
{
vector<Node> nodes;
while(1){
nodes.push_back(u);
if((d[u.x][u.y][u.dir]==0)) break;
u=p[u.x][u.y][u.dir];
}
nodes.push_back(Node{r0,c0,dir});
int cnt=0;
for(int i=nodes.size()-1;i>=0;i--){
cnt++;
if(cnt%10==1) printf(" (%d,%d)",nodes[i].x,nodes[i].y);
else if(cnt%10>=2) printf(" (%d,%d)",nodes[i].x,nodes[i].y);
else if(cnt%10==0) printf(" (%d,%d)\n",nodes[i].x,nodes[i].y);
}
if(nodes.size()%10!=0) printf("\n");
}
void solve()
{
queue<Node> q;
memset(d,-1,sizeof(d));
q.push(Node{r1,c1,dir});
d[r1][c1][dir]=0;
while(!q.empty()){
Node now=q.front();q.pop();
if(now.x==r2&&now.y==c2){
print(now);
return;
}
for(int i=0;i<4;i++){
Node v=walk(now,i);
if(has_edge[now.x][now.y][now.dir][i]&&inside(v.x,v.y)&&d[v.x][v.y][v.dir]<0){
d[v.x][v.y][v.dir]=d[now.x][now.y][now.dir]+1;
p[v.x][v.y][v.dir]=now;
q.push(v);
}
}
}
printf(" No Solution Possible\n");
}
int main()
{
char s[20];
while(scanf("%s",s)&&strcmp(s,"END")){
memset(has_edge,0,sizeof(has_edge));
char ch;
scanf("%d %d %c %d %d",&r0,&c0,&ch,&r2,&c2);
dir=dir_id(ch);
r1=r0+nxt[dir][0];c1=c0+nxt[dir][1];
int x,y; string str;
while(cin>>x&&x){
cin>>y;
while(cin>>str&&str[0]!='*'){
for(int i=1;i<str.size();i++){
has_edge[x][y][dir_id(str[0])][turn_id(str[i])]=1;
}
}
}
printf("%s\n",s);
solve();
}
}
#include<bits/stdc++.h>
const int inf=0x7fffffff;
using namespace std;
struct Node{
int x,y,dir;
};
int dir;
int has_edge[10][10][5][4],d[10][10][5],r0,r1,r2,c0,c1,c2;
Node p[10][10][5];
const char* dirs="NESW";
const char* turns="FLR";
int dir_id(char c){return strchr(dirs,c)-dirs;}
int turn_id(char c){return strchr(turns,c)-turns;}
const int nxt[4][2]={-1,0,0,1,1,0,0,-1};
Node walk(const Node &u,int turn)
{
int dir=u.dir;
if(turn==1) dir=(dir+3)%4;
if(turn==2) dir=(dir+1)%4;
return Node{u.x+nxt[dir][0],u.y+nxt[dir][1],dir};
}
bool inside(int x,int y){
return (x>=1&&y>=1&&x<=9&&y<=9);
}
void print(Node u)
{
vector<Node> nodes;
while(1){
nodes.push_back(u);
if((d[u.x][u.y][u.dir]==0)) break;
u=p[u.x][u.y][u.dir];
}
nodes.push_back(Node{r0,c0,dir});
int cnt=0;
for(int i=nodes.size()-1;i>=0;i--){
cnt++;
if(cnt%10==1) printf(" (%d,%d)",nodes[i].x,nodes[i].y);
else if(cnt%10>=2) printf(" (%d,%d)",nodes[i].x,nodes[i].y);
else if(cnt%10==0) printf(" (%d,%d)\n",nodes[i].x,nodes[i].y);
}
if(nodes.size()%10!=0) printf("\n");
}
void solve()
{
queue<Node> q;
memset(d,-1,sizeof(d));
q.push(Node{r1,c1,dir});
d[r1][c1][dir]=0;
while(!q.empty()){
Node now=q.front();q.pop();
if(now.x==r2&&now.y==c2){
print(now);
return;
}
for(int i=0;i<4;i++){
Node v=walk(now,i);
if(has_edge[now.x][now.y][now.dir][i]&&inside(v.x,v.y)&&d[v.x][v.y][v.dir]<0){
d[v.x][v.y][v.dir]=d[now.x][now.y][now.dir]+1;
p[v.x][v.y][v.dir]=now;
q.push(v);
}
}
}
printf(" No Solution Possible\n");
}
int main()
{
char s[20];
while(scanf("%s",s)&&strcmp(s,"END")){
memset(has_edge,0,sizeof(has_edge));
char ch;
scanf("%d %d %c %d %d",&r0,&c0,&ch,&r2,&c2);
dir=dir_id(ch);
r1=r0+nxt[dir][0];c1=c0+nxt[dir][1];
int x,y; string str;
while(cin>>x&&x){
cin>>y;
while(cin>>str&&str[0]!='*'){
for(int i=1;i<str.size();i++){
has_edge[x][y][dir_id(str[0])][turn_id(str[i])]=1;
}
}
}
printf("%s\n",s);
solve();
}
}
相关文章推荐
- JMeter源码集成到Eclipse
- Eclipse按哪个组合键可以自动添加import里面的包啊?
- C语言之反序数组和求最大值和最小值
- Spring注解:@Responsebody与@RequestBody
- 几种任务调度的 Java 实现方法与比较
- java cookie
- swig基本入门
- 【Java技术-反射】Java反射机制
- Python描述符:property()函数的小秘密
- C++库常用函数一览(<string><cctype><algorithm><cmath><cstdlib><iomanip><numeric>)
- 2016/1/18 Java开发中的23种设计模式详解(转)
- 使用delphi+intraweb进行微信开发2—intraweb以.net方式发布(以asp.net mvc4模式部署)在IIS(.net虚拟主机)上
- java jsonArray操作
- JAVA标识符
- 对于python的几个重要网址
- springmvc返回json数据
- C++重载和多态,
- Java学习——内部类
- 【第十三章】 测试 之 13.1 概述 13.2 单元测试 ——跟我学spring3
- Java关键字transient和volatile