点击打开链接http://acm.hdu.edu.cn/showproblem.php?pid=2102
AC代码 用到三维数组 ,第二次写的代码,因为memset(s,'*',sizeof(s));这里写错了,WA了无数次;
// hdu 2102 A ji hua (xiu gai ban)
#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
using namespace std;
#define N 15
struct point
{
int x, y, floor, time;
} st;
int m, n, t, flag;
char s[2][N][N];
int move[4][2] = {0, -1, 0, 1, -1, 0, 1, 0};
queue<point>q;
void bfs();
int main()
{
//freopen("1.in", "r", stdin);
int tt;
scanf("%d", &tt);
while (tt--)
{
int i, j;
scanf("%d %d %d", &n, &m, &t);
memset(s,'*',sizeof(s));
for (i = 0; i < 2; i++)
{
for (j = 0; j < n; j++)
{
scanf("%s", s[i][j]);
}
}
flag = 0;
st.x = 0;
st.y = 0;
st.floor = 0;
st.time = 0;
bfs();
if(flag) printf("YES\n");
else printf("NO\n");
}
}
void bfs()
{
while(!q.empty())
{
q.pop();
}
q.push(st);
while(!q.empty())
{
point now = q.front();
q.pop();
//printf("x %d y %d f %d t %d\n",now.x, now.y, now.floor, now.time);
for(int i=0;i<4;i++)
{
point next = now;
int xx = now.x, yy = now.y, f = now.floor;
//printf("xx %d yy %d\n",xx,yy);
xx += move[i][0];
yy += move[i][1];
next.time++;
if(next.time>t) continue;
if(xx<0 || xx>=n || yy<0 || yy>=m) continue;
if(s[f][xx][yy] == '*') continue;
if (s[f][xx][yy] == 'P')
{
flag = 1;
return;
}
if(s[f][xx][yy]=='#' && s[1-f][xx][yy] == 'P')
{
flag = 1;
return;
}
if(s[f][xx][yy]=='#' && s[1-f][xx][yy] == '#')
{
s[0][xx][yy] = '*';
s[1][xx][yy] = '*';
continue;
}
if(s[f][xx][yy]=='#' && s[1-f][xx][yy] == '*')
{
s[0][xx][yy] = '*';
s[1][xx][yy] = '*';
continue;
}
if(s[f][xx][yy]=='#' && s[1-f][xx][yy] == '.')
{
s[f][xx][yy] = '*';
s[1-f][xx][yy] = '*';
next.floor = 1-f;
next.x = xx;
next.y = yy;
}
if(s[f][xx][yy] == '.')
{
s[f][xx][yy] = '*';
next.x = xx;
next.y = yy;
}
q.push(next);
}
}
}
第一次写的代码,还是WA,不知原因啊》》》
//hdu 2102 A¼Æ»®
#include<iostream>
#include<queue>
#include<cstring>
#include<cstdio>
using namespace std;
struct point
{
int x, y, floor, time;
} st;
int m, n, t, flag;
char s1[15][15], s2[15][15];
int vis1[15][15], vis2[15][15];
int move[4][2] = {0, -1, 0, 1, -1, 0, 1, 0};
queue<point>q;
void bfs();
int main()
{
//freopen("1.in", "r", stdin);
int tt;
cin >> tt;
while (tt--)
{
int i, j ;
cin >> n >> m >> t;
memset(s1,'*',sizeof(s1));
memset(s2,'*',sizeof(s2));
for (i = 0; i < n; i++)
{
cin >> s1[i];
}
for (i = 0; i < n; i++)
{
cin >> s2[i];
}
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
if (s1[i][j] == 'S')
{
st.x = i;
st.y = j;
st.floor = 1;
st.time = 0;
break;
}
if (s2[i][j] == 'S')
{
st.x = i;
st.y = j;
st.floor = 2;
st.time = 0;
break;
}
}
}
memset(vis1, 0, sizeof(vis1));
memset(vis2, 0, sizeof(vis2));
flag = 0;
bfs();
if (flag)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
return 0;
}
void bfs()
{
while (!q.empty())
{
q.pop();
}
q.push(st);
while (!q.empty())
{
point now = q.front();
q.pop();
//printf("x %d,y %d, f %d, t %d\n",now.x,now.y,now.floor,now.time);
for (int i = 0; i < 4; i++)
{
int xx = now.x, yy = now.y;
xx += move[i][0];
yy += move[i][1];
if (s1[xx][yy] == 'P' && now.floor == 1 && now.time < t)
{
flag = 1;
return;
}
if (s2[xx][yy] == 'P' && now.floor == 2 && now.time < t)
{
flag = 1;
return;
}
if (xx >= 0 && xx < n && yy >= 0 && yy < m && now.time <= t)
{
point next = now;
if (now.floor == 1 && !vis1[xx][yy])
{
if (s1[xx][yy] == '.')
{
vis1[xx][yy] = 1;
next.x = xx;
next.y = yy;
next.floor = 1;
next.time++;
q.push(next);
}
else if (s1[xx][yy] == '#' && s2[xx][yy] != '*' && s2[xx][yy] != '#' && !vis2[xx][yy])
{
if(s2[xx][yy] == 'P') {flag = 1; return;}
else
{
vis2[xx][yy] = 1;
next.x = xx;
next.y = yy;
next.floor = 2;
next.time++;
q.push(next);
}
}
}
else if (now.floor == 2 && !vis2[xx][yy])
{
if (s2[xx][yy] == '.')
{
vis2[xx][yy] = 1;
next.x = xx;
next.y = yy;
next.floor = 2;
next.time++;
q.push(next);
}
else if (s2[xx][yy] == '#' && s1[xx][yy] != '*' && s1[xx][yy] != '#' && !vis1[xx][yy])
{
if(s1[xx][yy] == 'P') {flag = 1;return;}
else
{
vis1[xx][yy] = 1;
next.x = xx;
next.y = yy;
next.floor = 1;
next.time++;
q.push(next);
}
}
}
else
{
continue;
}
}
}
}
}