很久不做题了。。早上找状态。。水一个
DFS(15MS):
#include<stdio.h>
int N,M;
char map[200][200];
char c;
int ai,aj,ri,rj;
int min;
int mintime[200][200];
int move[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; //0:x, 1:y
int inarea(int x,int y)
{
return x>=0 && y>=0 && x<N && y<M && map[x][y]!='#';
}
void dfs(int x,int y,int time,int count)
{
mintime[x][y]=time;
for (int i=0; i<4; i++) {
if (inarea(x+move[i][0], y+move[i][1]) && time+1+(map[x+move[i][0]][y+move[i][1]]=='x'? 1:0)<mintime[x+move[i][0]][y+move[i][1]]) {
dfs(x+move[i][0], y+move[i][1],time+1+(map[x+move[i][0]][y+move[i][1]]=='x'? 1:0),count+1);
}
}
}
int main()
{
while (~scanf("%d%d",&N,&M)) {
for (int i=0; i<N; i++) {
for (int j=0; j<M; j++) {
mintime[i][j]=100000000;
}
}
getchar();
for (int i=0; i<N; i++) {
for (int j=0; j<M; j++) {
c=getchar();
if (c=='a') {
ai=i;
aj=j;
map[i][j]='.';
}
else if (c=='r') {
ri=i;
rj=j;
map[i][j]='.';
}
else {
map[i][j]=c;
}
}
getchar();
}
dfs(ri,rj,0,0);
if(mintime[ai][aj]==100000000) printf("Poor ANGEL has to stay in the prison all his life.\n");
else printf("%d\n",mintime[ai][aj]);
}
}
BFS(15MS):
#include<stdio.h>
int N,M;
char map[200][200];
char c;
int ai,aj,ri,rj;
int min;
int mintime[200][200];
int mincount[200][200];
int queue_i[40000];
int queue_j[40000];
int queue_time[40000];
int queue_count[40000];
int move[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; //0:x, 1:y
int inarea(int x,int y)
{
return x>=0 && y>=0 && x<N && y<M && map[x][y]!='#';
}
void bfs()
{
int head=0,tail=0;
queue_i[tail]=ri;
queue_j[tail]=rj;
queue_time[tail]=0;
queue_count[tail++]=0;
while (head<tail) {
for (int i=0; i<4; i++) {
if (inarea(queue_i[head]+move[i][0],queue_j[head]+move[i][1]) && mintime[queue_i[head]+move[i][0]][queue_j[head]+move[i][1]]>queue_time[head]+1+((map[queue_i[head]+move[i][0]][queue_j[head]+move[i][1]]=='x')? 1:0)) {
queue_i[tail]=queue_i[head]+move[i][0];
queue_j[tail]=queue_j[head]+move[i][1];
queue_time[tail]=queue_time[head]+1;
if (map[queue_i[head]+move[i][0]][queue_j[head]+move[i][1]]=='x') {
queue_time[tail]++;
}
queue_count[tail]=queue_count[head]+1;
mintime[queue_i[head]+move[i][0]][queue_j[head]+move[i][1]]=queue_time[tail];
mincount[queue_i[head]+move[i][0]][queue_j[head]+move[i][1]]=queue_count[tail];
tail++;
}
}
head++;
}
}
int main()
{
while (~scanf("%d%d",&N,&M)) {
for (int i=0; i<N; i++) {
for (int j=0; j<M; j++) {
mintime[i][j]=100000000;
}
}
getchar();
for (int i=0; i<N; i++) {
for (int j=0; j<M; j++) {
c=getchar();
if (c=='a') {
ai=i;
aj=j;
map[i][j]='.';
}
else if (c=='r') {
ri=i;
rj=j;
map[i][j]='.';
}
else {
map[i][j]=c;
}
}
getchar();
}
bfs();
if(mintime[ai][aj]==100000000) printf("Poor ANGEL has to stay in the prison all his life.\n");
else printf("%d\n",mintime[ai][aj]);
}
}
浙公网安备 33010602011771号