您的位置:首页 > 其它

hdu1180——诡异的楼梯

2010-10-31 21:50 447 查看
愤啊。。。居然不过,火了。。。等哪天我乐意了,再自己A

贴上复制代码:

#include<iostream>
#include<queue>
using namespace std;
int dir[4][2]={0,1,1,0,0,-1,-1,0};

int m,n,ai,bi,ci,di;
char map[21][21];
int visited[21][21];

struct node
{
int x,y;
int time;
};

int check(int a,int b)
{
if(a>=0&&a<m&&b>=0&&b<n&&!visited[a][b])
return 1;
return 0;
}

int loucheck(int a,int b,int c,int d,int step)
{
if(c>=0&&c<m&&d>=0&&d<n&&!visited[c][d])
{
if(map[a][b]=='|')
{
if(d==b) // 竖着过来
{
if(step%2==0)
return 1;
else return 0;
}
else   // 横着过来
{
if(step%2)
return 1;
else return 0;
}
}
else
{
if(b==d)
{
if(step%2)
return 1;
else return 0;
}
else
{
if(step%2==0)
return 1;
else return 0;
}
}
}
return 0;
}

void bfs()
{
int i;
queue<node>Q;
struct node p,q,key;
memset(visited,0,sizeof(visited));
p.x=ai;
p.y=bi;
p.time=0;
Q.push(p);
visited[ai][bi]=1;
while(!Q.empty())
{
q=Q.front();
for(i=0;i<4;i++)
{
key.x=q.x+dir[i][0];
key.y=q.y+dir[i][1];
if(map[key.x][key.y]!='*'&&check(key.x,key.y))
{
if(map[key.x][key.y]=='T')
{
cout<<q.time+1<<endl;
return;
}
if(map[key.x][key.y]=='.')
{
visited[key.x][key.y]=1;
key.time=q.time+1;
Q.push(key);
}
else if(map[key.x][key.y]=='|'||map[key.x][key.y]=='-')
{
p.x=key.x+dir[i][0];
p.y=key.y+dir[i][1];
if(loucheck(key.x,key.y,p.x,p.y,q.time)) // 注意这里要把楼梯前一点的时间传进函数判断
{
p.time=q.time+1;
visited[p.x][p.y]=1;
if(map[p.x][p.y]=='T') // 楼梯过去的那一点也要判断是否就是终点了,否则要在每次取队头元素的时候加判断一次
{
cout<<p.time<<endl;
return;
}
Q.push(p);
}
else if(check(p.x,p.y)) // 如果不能过楼梯,就在当前一点再入队一次,注意时间要加一
{
p.x=q.x;
p.y=q.y;
p.time=q.time+1;
visited[p.x][p.y]=1;
Q.push(p);
}
}
}
}
Q.pop();
}
}

int main()
{
while(cin>>m>>n)
{
//        memset(map,'*',sizeof(map));
int i,j;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
cin>>map[i][j];
if(map[i][j]=='S')
{
ai=i;
bi=j;
}
}
bfs();
}
return 0;
}


顺便贴上WA的代码:

#include<stdio.h>
#include<string.h>
#define max 1005
char g[max][max];
int dir[][2]={{0,-1},{0,1},{-1,0},{1,0}};
int n,m;
bool vis[max][max];
struct node
{
int x,y;
int time;
}s;
bool find(int x,int y)
{
if(x>=0&&x<m&&y>=0&&y<n&&vis[x][y])
return true;
return false;
}
bool abs(int a)
{
if(a>=0)return a;
return -a;
}
bool check(int x,int y,struct node p,struct node temp)
{
if(p.x>=0&&p.x<m&&p.y>=0&&p.y<n&&vis[p.x][p.y])
{
if(g[p.x][p.y]=='|')
{
if(temp.time %2==0&&!abs(p.y-y))
return true;
else if(temp.time %2!=0&&!abs(p.x-x))
return true;
}
else if(g[p.x][p.y]=='-')
{
if(temp.time %2==0&&!abs(p.x-x))
return true;
if(temp.time %2!=0&&!abs(p.y-y))
return true;
}
}
return false;
}
void bfs()
{
struct node queue[2000],p,q,key;
int front=0,rear=0,i;
rear++;
queue[rear].x=s.x;queue[rear].y=s.y;queue[rear].time =0;
memset(vis,true,sizeof(vis));
vis[s.x][s.y]=false;
while(front!=rear)
{
front++;
q=queue[front];
for(i=0;i<4;i++)
{
key.x=q.x+dir[i][0];
key.y=q.y+dir[i][1];
if(find(key.x,key.y)&&g[key.x][key.y]!='*')
{
if(g[key.x][key.y]=='T')
{
printf("%d/n",q.time);
return ;
}
if(g[key.x][key.y]=='.')
{
vis[key.x][key.y]=false;
key.time =q.time +1;
rear++;queue[rear]=key;
}
if(g[key.x][key.y]=='|'||g[key.x][key.y]=='-')
{
p.x=key.x+dir[i][0];p.y=key.y+dir[i][1];
if(check(key.x,key.y,p,q))
{
p.time=q.time+1;
vis[p.x][p.y]=false;
if(g[p.x][p.y]=='T')
{
printf("%d/n",p.time );
return;
}
rear++;queue[rear]=p;
}
else
{
p.x=q.x;
p.y=q.y;
p.time=q.time+1;
vis[p.x][p.y]=false;
rear++;queue[rear]=p;
}
}
}
}
}
}
int main()
{
int i,j;
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
{
scanf("%s",&g[i]);
for(j=0;j<m;j++)
if(g[i][j]=='S')
{
s.x=i;s.y=j;
}
}
bfs();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: