2 5 5 ...** *.**. ..... ..... *.... 1 1 1 1 3 5 5 ...** *.**. ..... ..... *.... 2 1 1 1 3
no yes
#include<cstdio> #include<cstring> #include<queue> using namespace std; int n,m; int k,ok; char map[110][110]; int vis[4][110][110]; int ff[4][2]={1,0, 0,1, -1,0, 0,-1}; struct Node{ int x,y; }star,last; struct FF{ int x,y; int flag,cnt; }; bool operator <(FF a,FF b) { return a.cnt>b.cnt; } priority_queue<FF> que; void BFS() { int i,j; while(!que.empty()) que.pop(); FF tmp,a; tmp.x=star.x; tmp.y=star.y; tmp.cnt=0; memset(vis,-1,sizeof(vis)); for(i=0;i<4;i++) { tmp.flag=i; que.push(tmp); vis[tmp.flag][tmp.y][tmp.x]=1; } int tmp_x,tmp_y; ok=0; while(!que.empty()) { tmp=que.top(); que.pop(); if(tmp.cnt>k) return ; if(tmp.x==last.x && tmp.y==last.y) { ok=1; return ; } for(i=0;i<4;i++) { tmp_x=tmp.x+ff[i][0]; tmp_y=tmp.y+ff[i][1]; while(tmp_x>=0 && tmp_x<m && tmp_y>=0 && tmp_y<n && map[tmp_y][tmp_x]=='.') { a.x=tmp_x; a.y=tmp_y; a.flag=i; if(i==tmp.flag) { a.cnt=tmp.cnt; if(vis[a.flag][a.y][a.x]==-1|| vis[a.flag][a.y][a.x]>a.cnt) { vis[a.flag][a.y][a.x]=a.cnt; que.push(a); } } else { a.cnt=tmp.cnt+1; if(vis[a.flag][a.y][a.x]==-1 || vis[a.flag][a.y][a.x]>a.cnt) { vis[a.flag][a.y][a.x]=a.cnt; que.push(a); } break; } tmp_x=tmp_x+ff[i][0]; tmp_y=tmp_y+ff[i][1]; } } } } int main() { int T; int i; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for(i=0;i<n;i++) scanf("%s",map[i]); scanf("%d%d%d%d%d",&k,&star.x,&star.y,&last.x,&last.y); star.x--; star.y--; last.x--; last.y--; BFS(); if(ok) printf("yes\n"); else printf("no\n"); } return 0; }
DFS果断容易写,10来分钟就写好了,1A,速度还比上面的BFS快了很多
#include<cstdio> #include<cstring> int n,m,k; int ok; char map[110][110]; int vis[4][110][110]; struct Node{ int x,y; int cnt; }star,last,tmp; int num[4][2]={0,1, 1,0, -1,0, 0,-1}; void DFS(int x,int y,int flag,int cnt) { if(cnt>k) return ; // printf("%d %d %d %d\n",x,y,flag,cnt); if(x==last.x && y==last.y) { ok=1; } if(ok) return ; for(int i=0;i<4;i++) { tmp.x=x+num[i][0]; tmp.y=y+num[i][1]; if(tmp.x>=0 && tmp.x<n && tmp.y>=0 && tmp.y<m && map[tmp.x][tmp.y]=='.') { if(i==flag) tmp.cnt=cnt; else tmp.cnt=cnt+1; if(vis[i][tmp.x][tmp.y]==-1 || vis[i][tmp.x][tmp.y]>tmp.cnt) { vis[i][tmp.x][tmp.y]=tmp.cnt; DFS(tmp.x,tmp.y,i,tmp.cnt); } } } } int main() { int t,i; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(i=0;i<n;i++) scanf("%s",map[i]); scanf("%d%d%d%d%d",&k,&star.y,&star.x,&last.y,&last.x); star.x--; star.y--; last.x--; last.y--; ok=0; memset(vis,-1,sizeof(vis)); for(i=0;i<4;i++) { vis[i][star.x][star.y]=0; DFS(star.x,star.y,i,0); } if(ok) printf("yes\n"); else printf("no\n"); } return 0; }