uva816 Abbott’s Revenge

2023-11-03 18:08
文章标签 uva816 revenge abbott

本文主要是介绍uva816 Abbott’s Revenge,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

自己写的,测试了好多数据都行,但是WA,望大神指出错误


#include<bits/stdc++.h>
#include<stdio.h>
#include<cstring>
using namespace std;
int edge[10][10][5][5];
int xx[10][10][5];
int dir1[5][2];
struct node
{int x;int y;int dir;int pi;
};
int visit[10][10][5][5],visit1[10][10][5];
node p[10][10][5];
node path[1005];
map<char,int>d;
string str;
char name[105];
int openx,openy,endx,endy,sum=0,flag=0;
char di;
node now,open;
int work(int dir,int j)
{int d;switch(dir){case 1:if(j==1) d=4;else if(j==2) d=1;else if(j==3) d=2;break;case 2:if(j==1) d=1;else if(j==2) d=2;else if(j==3) d=3;break;case 3:if(j==1) d=2;else if(j==2) d=3;else if(j==3) d=4;break;case 4:if(j==1) d=3;else if(j==2) d=4;else if(j==3) d=1;break;}return d;
}
void bfs()
{int dr,r;memset(visit,0,sizeof(visit));queue<node>q;node op,n;op.x=openx;op.y=openy;op.dir=d[di];dr=work(op.dir,2);r=op.dir+2;op.pi=2;if(r%4==0)r=4;elser%=4;flag=0;n.x=openx+dir1[r][0];n.y=openy+dir1[r][1];n.dir=dr;n.pi=2;if(n.x==endx&&n.y==endy){flag=1;now=n;p[n.x][n.y][n.dir]=op;open=op;return;}else if(n.x>=1&&n.x<=9&&n.y>=1&&n.y<=9&&xx[n.x][n.y][n.dir]){open=n;p[n.x][n.y][n.dir]=op;q.push(n);}while(!q.empty()){node temp=q.front();q.pop();for(int j=1;j<=3;j++){if(edge[temp.x][temp.y][temp.dir][j]){visit[temp.x][temp.y][temp.dir][j]=1;temp.pi=j;dr=work(temp.dir,j);r=temp.dir+j;if(r%4==0)r=4;elser%=4;n.x=temp.x+dir1[r][0];n.y=temp.y+dir1[r][1];n.dir=dr;n.pi=j;if(n.x==endx&&n.y==endy){flag=1;now=n;p[n.x][n.y][n.dir]=temp;break;}if(n.x>=1&&n.x<=9&&n.y>=1&&n.y<=9&&xx[n.x][n.y][n.dir]){if(!visit1[n.x][n.y][n.dir]){visit1[n.x][n.y][n.dir]=1;p[n.x][n.y][n.dir]=temp;q.push(n);}}}}if(flag)break;}
}
void print(int pi)
{int sum=0;if(flag){int num=0;while(1){path[++sum]=now;now=p[now.x][now.y][now.dir];if(now.x==open.x&&now.y==open.y&&now.dir==open.dir/*&&num==*/){path[++sum]=now;path[++sum]=p[now.x][now.y][now.dir];break;}}cout<<"  ";for(int i=sum;i>=1;i--){num++;if(!path[i].x&&!path[i].y)continue;if(num==11){num==1;cout<<"\n  ";cout<<'('<<path[i].x<<','<<path[i].y<<") ";}else{cout<<'('<<path[i].x<<','<<path[i].y<<") ";}}cout<<endl;return;}else{cout<<"  No Solution Possible"<<endl;return ;}
}
int main()
{int x,y;dir1[1][0]=0;dir1[1][1]=-1;dir1[2][0]=-1;dir1[2][1]=0;dir1[3][0]=0;dir1[3][1]=1;dir1[4][0]=1;dir1[4][1]=0;d['E']=1;d['S']=2;d['W']=3;d['N']=4;map<char,int>t;t['L']=1;t['F']=2;t['R']=3;while(scanf("%s",name)){if(strcmp(name,"END")==0)break;cout<<name<<endl;cin>>openx>>openy>>di>>endx>>endy;memset(edge,0,sizeof(edge));memset(xx,0,sizeof(xx));memset(visit1,0,sizeof(visit1));int num=0;while(cin>>x){if(x==0)break;cin>>y;while(cin>>str){if(str=="*")break;else{char s=str[0];xx[x][y][d[s]]=1;for(int i=1;i<str.size();i++){edge[x][y][d[s]][t[str[i]]]=1;}}}}bfs();print(d[di]);}return 0;
}


这篇关于uva816 Abbott’s Revenge的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/339946

相关文章

【HDU】5021 Revenge of kNN II 树状数组

传送门:【HDU】5021 Revenge of kNN II 题目分析:【HDU】4995 Revenge of kNN的升级版,这次取消的K<=10的限制。 但是依旧可以做! 首先我们将点按照横坐标从小到大排序,然后对于每次查询,我们先二分距离mid,然后再二分查找在X-mid,X+mid里面有多少数,如果小于K则抬升下界,如果大于K+1则降低上界,如果等于K则直接更新,还有就是正

【HDU】5020 Revenge of Collinearity 极角排序

传送门:【HDU】5020 Revenge of Collinearity 题目分析:水计算几何,极角排序,第一关键字y轴,第二关键字x轴。 话说不用long long 竟然比用了慢,果然我不懂计算机的心。 代码如下: #include <cmath>#include <cstdio>#include <cstring>#include <algori

hdu 4099 Revenge of Fibonacci(字典树)

题目链接:hdu 4099 Revenge of Fibonacci 题目大意:给定一个前缀,找到最小的n,保证f(n)包含前缀。f为斐波那契数列,要求n小于100000。 解题思路:大数加法,对100000以内的斐波那契数预处理出前缀,这里处理的时候只需要对前50位进行加法处理即 可,否则复杂度过高,因为查询的长度不会超过40。然后建立字典树,查询则在字典树上进行搜索。 #inc

hdu 5018 Revenge of Fibonacci(模拟)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5018 Revenge of Fibonacci Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 940    Accepted Sub

php伪协议 [SWPUCTF 2022 新生赛]ez_ez_php(revenge)

打开题目 题目源代码如下 <?phperror_reporting(0);if (isset($_GET['file'])) {if ( substr($_GET["file"], 0, 3) === "php" ) {echo "Nice!!!";include($_GET["file"]);} else {echo "Hacker!!";}}else {highlight_file

uva 816 Abbott's Revenge (走迷宫BFS)

原题链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=757 参考刘汝佳《算法竞赛入门经典(第二版)》做的(P165)。 耐心看看书上写的步骤挺条理的,也比较好明白。 注意事项: 输出的时候注意空格 代码如下: #inc

2016CCPC东北-A.Minimum’s Revenge

题目链接http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1001&cid=729 #include<stdio.h>#include<iostream>#define ll long longusing namespace std;int main(){int t;cin>>t;int cnt=1;while(t--

hdu 5019 Revenge of GCD

题意:两个数x,y,求他们第k大的公约数。         思路:先用欧几里德算法求出最大公约数z,然后求z的所有约数,排序,取第k大的。因为z的约数是x,y的公约数的充要条件。 #include <iostream> #include <stdio.h> #include <cmath>

HDU 4787 GRE Words Revenge 在线AC自动机

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4787 构造两个自动机 当一个自动机大于节点上限,就将BUFF全部加入AC 有个问题就是TOP在1000的时候能AC 5000和500就会WA不是很懂为什么 代码: #include <bits/stdc++.h>#define sf scanf#define pf printfusing

816 - Abbott‘s Revenge (UVA)

题目链接如下: Online Judge 刘汝佳大佬的代码如下: uva 816(经典bfs例子)-CSDN博客 有点抽象,但很简洁。 我自己的代码比较臃肿,又臭又长....而且改了很久才AC。暂时没力气写刘汝佳的版本了...我的代码如下: #include <iostream>#include <string>#include <vector>#include <algorit