您的位置:首页 > 其它

HDU 1180 诡异的楼梯

2013-07-22 15:00 393 查看
链接:点击打开链接

题意:题意应该很好理解,就是从S到T的最少步数,只是加了一个楼梯。

思路:一看就是广搜,找最少的步数,Harry只能每次走到相邻的格子而不能斜走,每移动一次恰好为一分钟,并且Harry登上楼梯并经过楼梯到达对面的整个过程只需要一分钟,Harry从来不在楼梯上停留.并且每次楼梯都恰好在Harry移动完毕以后才改变方向.所以每次走到楼梯时特判一下,遵循奇变偶不变的原则,可以走过去,就只花一分钟,不能走过去,则花两分钟。除了楼梯,每次走过的点被标记。一遍BFS就能得出答案。

这是自己的,有点麻烦:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct node{
int x;
int y;
int count;
};
int n,m,fx,fy,ex,ey;
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
bool vis[30][30];
char str[30][30];
void bfs(){
int i;
queue<node>Q;
node p,q;
p.x=fx;
p.y=fy;
p.count=0;
vis[p.x][p.y]=true;
Q.push(p);
while(!Q.empty()){
p=Q.front();
Q.pop();
if(p.x==ex&&p.y==ey){
printf("%d\n",p.count);
return;
}
if(p.x<1||p.x>n||p.y<1||p.y>m)
continue;
for(i=0;i<4;i++){
q=p;
q.x=p.x+dx[i];
q.y=p.y+dy[i];
if(str[q.x][q.y]=='|'){
if(q.x==p.x&&q.count%2!=0){
q.y=q.y+dy[i];
q.count=p.count+1;
if(str[q.x][q.y]=='.'&&!vis[q.x][q.y]){
vis[q.x][q.y]=true;
Q.push(q);}
}
else if(q.x==p.x&&q.count%2==0){
q.y=q.y+dy[i];
q.count=p.count+2;
if(str[q.x][q.y]=='.'&&!vis[q.x][q.y]){
vis[q.x][q.y]=true;
Q.push(q);
}
}
else  if(q.y==p.y&&q.count%2==0){
q.x=q.x+dx[i];
q.count=p.count+1;
if(str[q.x][q.y]=='.'&&!vis[q.x][q.y]){
vis[q.x][q.y]=true;
Q.push(q);
}
}
else if(q.y==p.y&&q.count%2!=0){
q.x=q.x+dx[i];
q.count=p.count+2;
if(str[q.x][q.y]=='.'&&!vis[q.x][q.y]){
vis[q.x][q.y]=true;
Q.push(q);
}
}
}
else if(str[q.x][q.y]=='-'){
if(q.x==p.x&&q.count%2==0){
q.y=q.y+dy[i];
q.count=p.count+1;
if(str[q.x][q.y]=='.'&&!vis[q.x][q.y]){
vis[q.x][q.y]=true;
Q.push(q);
}
}
else  if(q.x==p.x&&q.count%2!=0){
q.y=q.y+dy[i];
q.count=p.count+2;
if(str[q.x][q.y]=='.'&&!vis[q.x][q.y]){
vis[q.x][q.y]=true;
Q.push(q);
}
}
else if(q.y==p.y&&q.count%2!=0){
q.x=q.x+dx[i];
q.count=p.count+1;
if(str[q.x][q.y]=='.'&&!vis[q.x][q.y]){
vis[q.x][q.y]=true;
Q.push(q);}
}
else if(q.y==p.y&&q.count%2==0){
q.x=q.x+dx[i];
q.count=p.count+2;
if(str[q.x][q.y]=='.'&&!vis[q.x][q.y]){
vis[q.x][q.y]=true;
Q.push(q);
}
}
}
else if(str[q.x][q.y]=='.'&&!vis[q.x][q.y]){
q.count=p.count+1;
vis[q.x][q.y]=true;
Q.push(q);
}
}
}
}
int main(){
int i,j;
while(~scanf("%d %d",&n,&m)){
for(i=1;i<=n;i++){
getchar();
for(j=1;j<=m;j++){
scanf("%c",&str[i][j]);
if(str[i][j]=='S'){
fx=i;
fy=j;
}
else if(str[i][j]=='T'){
ex=i;
ey=j;
str[i][j]='.';
}
}
}
memset(vis,false,sizeof(vis));
bfs();
}
return 0;
}
这是别人AC代码,但是又错误,卡数据过的,考虑不完全,当时一直在想那个加2是怎么来的:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct node{
int x;
int y;
int count;
};
int n,m,fx,fy,ex,ey;
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
bool vis[30][30];
char str[30][30];
void bfs(){
int i;
queue<node>Q;
while(!Q.empty())
Q.pop();
node p,q;
p.x=fx;
p.y=fy;
p.count=0;
Q.push(p);
vis[p.x][p.y]=true;
while(!Q.empty()){
p=Q.front();
Q.pop();
if(p.x<1||p.x>n||p.y<1||p.y>m)
continue;
if(p.x==ex&&p.y==ey){
printf("%d\n",p.count);
return;
}
for(i=0;i<4;i++){
//q=p;
q.x=p.x+dx[i];
q.y=p.y+dy[i];
if(!vis[q.x][q.y]&&str[q.x][q.y]!='*'){
if(str[q.x][q.y]=='.'){
q.count=p.count+1;
Q.push(q);
vis[q.x][q.y]=true;
}
if(str[q.x][q.y]=='-'&&(p.count%2)==0||str[q.x][q.y]=='|'&&(p.count%2)==1){
if(q.x==p.x){
q.y=q.y+dy[i];
q.count=p.count+1;
if(!vis[q.x][q.y]&&str[q.x][q.y]=='.'){
Q.push(q);
vis[q.x][q.y]=true;
}
}
else {
q.x=q.x+dx[i];
q.count=p.count+1;
Q.push(q);
}
}
if(str[q.x][q.y]=='|'&&(p.count%2)==0||str[q.x][q.y]=='-'&&(p.count%2)==1){
if(q.y==p.y){
q.x=q.x+dx[i];
q.count=p.count+1;
if(!vis[q.x][q.y]&&str[q.x][q.y]=='.'){
vis[q.x][q.y]=true;
Q.push(q);
}
}
else {
q.y=q.y+dy[i];
q.count=p.count+2;
Q.push(q);
}
}
}
}
}
// printf("0\n");
}
int main(){
int i,j;
while(~scanf("%d %d",&n,&m)){
//if(n==0&&m==0)
//    break;
for(i=1;i<=n;i++){
getchar();
for(j=1;j<=m;j++){
scanf("%c",&str[i][j]);
if(str[i][j]=='S'){
fx=i;
fy=j;
}
else if(str[i][j]=='T'){
ex=i;
ey=j;
str[i][j]='.';
}
}
}
memset(vis,false,sizeof(vis));
bfs();
}
return 0;
}


这是我根据上面改的:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct node{
int x;
int y;
int count;
};
int n,m,fx,fy,ex,ey;
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
bool vis[30][30];
char str[30][30];
void bfs(){
int i;
queue<node>Q;
while(!Q.empty())
Q.pop();
node p,q;
p.x=fx;
p.y=fy;
p.count=0;
Q.push(p);
vis[p.x][p.y]=true;
while(!Q.empty()){
p=Q.front();
Q.pop();
if(p.x<1||p.x>n||p.y<1||p.y>m)
continue;
if(p.x==ex&&p.y==ey){
printf("%d\n",p.count);
return;
}
for(i=0;i<4;i++){
//q=p;
q.x=p.x+dx[i];
q.y=p.y+dy[i];
if(!vis[q.x][q.y]&&str[q.x][q.y]!='*'){
if(str[q.x][q.y]=='.'){
q.count=p.count+1;
Q.push(q);
vis[q.x][q.y]=true;
}
if(str[q.x][q.y]=='-'&&(p.count%2)==0||str[q.x][q.y]=='|'&&(p.count%2)==1){
if(q.x==p.x){
q.y=q.y+dy[i];
q.count=p.count+1;
if(!vis[q.x][q.y]&&str[q.x][q.y]=='.'){
Q.push(q);
vis[q.x][q.y]=true;
}
}
else {
q.x=q.x+dx[i];
q.count=p.count+2;
if(str[q.x][q.y]=='.'&&!vis[q.x][q.y]){
Q.push(q);
vis[q.x][q.y]=true;
}
}
}
if(str[q.x][q.y]=='|'&&(p.count%2)==0||str[q.x][q.y]=='-'&&(p.count%2)==1){
if(q.y==p.y){
q.x=q.x+dx[i];
q.count=p.count+1;
if(!vis[q.x][q.y]&&str[q.x][q.y]=='.'){
vis[q.x][q.y]=true;
Q.push(q);
}
}
else {
q.y=q.y+dy[i];
q.count=p.count+2;
if(str[q.x][q.y]=='.'&&!vis[q.x][q.y]){
Q.push(q);
vis[q.x][q.y]=true;
}
}
}
}
}
}
// printf("0\n");
}
int main(){
int i,j;
while(~scanf("%d %d",&n,&m)){
//if(n==0&&m==0)
//	break;
for(i=1;i<=n;i++){
getchar();
for(j=1;j<=m;j++){
scanf("%c",&str[i][j]);
if(str[i][j]=='S'){
fx=i;
fy=j;
}
else if(str[i][j]=='T'){
ex=i;
ey=j;
str[i][j]='.';
}
}
}
memset(vis,false,sizeof(vis));
bfs();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: