模拟
题目链接:https://www.luogu.org/problem/show?pid=1518
非常简单的模拟,刚开始我想的是bfs,
理解成了相遇的最小步数。
然后……调了一上午,QAQQ
重新看题,发现理解错了……(我到底在想什么)
重点是……题目都告诉你怎么写了!!!
(截自洛谷)
我还能不能再zz一点……QAQQ
不扯了,伤心……
注意判重需要确定整个状态,
包括两个坐标和各自的方向,
如果走到相同的状态,则不可能相遇
其他的还真没什么好说的……伤心QAQ
Codes:
1 #include2 #include 3 #include 4 #include 5 #include 6 7 using namespace std; 8 9 const int N = 10 + 10;10 char mp[N][N];11 bool vis[N][N][N][N][N][N];12 int xx[] = { 0,-1,0,1,0},yy[] = { 0,0,1,0,-1};13 14 bool check(int x,int y){15 if(x > 10 || x < 1 || y < 1 || y > 10) return false; //越界 16 if(mp[x][y] == '*') return false; //障碍物 17 return true;18 }19 int work(int x,int y,int lx,int ly){20 int f1,f2;21 f1 = f2 = 1;22 int step = 0;//minutes 23 while(1){24 if(check(x + xx[f1],y + yy[f1])) //如果能走,继续原来的方向 25 x += xx[f1],y += yy[f1];26 else //否则用这一分钟转变方向 27 f1 = f1 % 4 + 1;28 if(check(lx + xx[f2],ly + yy[f2])) 29 lx += xx[f2],ly += yy[f2];30 else 31 f2 = f2 % 4 + 1;32 step ++;33 if(vis[x][y][lx][ly][f1][f2]) //走到相同状态则不可能相遇 34 return 0;35 vis[x][y][lx][ly][f1][f2] = 1;36 if(x == lx && y == ly) //相遇 37 return step;38 }39 return 0;40 }41 int main(){42 int lx,ly,x,y;43 for(int i = 1;i <= 10;++ i){44 scanf("%s",mp[i] + 1); //注意不能写 &mp[i] + 1 45 for(int j = 1;mp[i][j];++ j){46 if(mp[i][j] == 'F') 47 lx = i,48 ly = j;49 if(mp[i][j] == 'C')50 x = i,51 y = j;52 }53 }54 if(x == lx && y == ly) {55 cout << "0" << '\n';56 return 0;57 }58 int ans = work(x,y,lx,ly);59 cout << ans << '\n';60 return 0;61 }
MAS:
判重注意确定一种状态。
看错题这种错误还是少犯,认真读题啊!!