CCF CSP 201604-4 遊戲
阿新 • • 發佈:2018-12-31
解題思路:學過搜尋的一眼就能看出是廣搜,沒學過建議翻翻書,畢竟考得挺多。
注意事項:
1.廣搜用佇列來實現,也可用陣列迴圈來實現。
2.需要優化,不然會出現超時。
3.通關最長時間不超過300秒。
4.可以往回走。
5.每走一步都要判斷是否安全和是否可達。
6.最關鍵的一個條件,不太容易在短時間想到:同一個節點同一時刻只能加佇列一次。必須加上這個條件不然會超時。
#include<stdio.h> #include<iostream> #include<queue> #define Max 300 using namespace std; int edgN,edgM,n; int time[Max][Max][2]; bool vis[Max][Max][Max]; struct Node{ int x,y; int t; Node(int _x,int _y,int _t):x(_x),y(_y),t(_t) { } }; bool leg(int x,int y) { if(x>=1&&x<=edgN&&y<=edgM&&y>=1) return true; return false; } int main() { int r,c,a,b; int ore[4][2]={0,-1,-1,0,0,1,1,0}; // int ore[4][2] = {{0,1},{0,-1},{1,0},{-1,0}}; while(scanf("%d%d%d",&edgN,&edgM,&n)!=EOF) { for(int i=0;i<n;i++) { scanf("%d%d%d%d",&r,&b,&a,&c); time[r][b][0]=a; //起始時間 time[r][b][1]=c;//結束時間 } queue<Node> q; q.push(Node(1,1,0)); vis[1][1][0] = true; while(!q.empty()) { Node curq = q.front(); q.pop(); if(curq.x==edgN&&curq.y==edgM) { printf("%d\n",curq.t); break; } for(int i=0;i<4;i++) { int x= curq.x+ore[i][0]; int y =curq.y+ore[i][1]; int t=curq.t+1; if(leg(x,y)&&(t<time[x][y][0]||t>time[x][y][1])&&!vis[x][y][t]) { vis[x][y][t]=true; q.push(Node(x,y,t)); } } } } return 0; }