題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=1072
這是一個很簡單的一個搜尋題目,資料量很小,基本上如果不陷入死迴圈就不會逾時,我犯了個小錯誤,rec在每次加過之後沒有恢複,一度錯我,半小時內沒發現
導致一直調試不通過!
這個其實就是一道普通的BFS,用lock數組記錄到當前節點還剩下的時間,如果下次又到達這裡但是剩下的時間比上次來的時候少,那麼就不用來了,人家時間多的
都還沒到,你時間少的還過來,其次就是一些常識性減枝,完成一些更新,就ok了,看AC比率基本上都是1Y了
#include <iostream>#include <string.h>#include <stdio.h>#include <queue>#include <algorithm>using namespace std;int map[100][100];int n,m;int dir[4][2]={{1,0},{0,1},{0,-1},{-1,0}};struct point{ int have; int time; int i,j;};int lock[100][100];int find_ans(int i,int j){ queue<point>q; int ans=99999; point temp,rec; temp.have=6,temp.time=0,temp.i=i,temp.j=j; q.push(temp); while(!q.empty()) { temp=q.front(); rec=temp; // printf("%d %d\n",rec.i,rec.j); q.pop(); if(rec.time >=ans || rec.have<=0) continue; if(map[rec.i][rec.j]==3) { ans=rec.time; continue; } if(map[rec.i][rec.j]==4) { temp.have=6; rec.have=6; } for(i=0;i<4;i++) { rec=temp; if(map[temp.i+dir[i][0]][temp.j+dir[i][1]]!=0) { //printf("temp: %d %d\n",temp.i+dir[i][0],temp.j+dir[i][1]); rec.i+=dir[i][0],rec.j+=dir[i][1]; rec.have--; rec.time++; //printf("I:%d %d %d\n",i,rec.i,rec.j); if(lock[temp.i+dir[i][0]][temp.j+dir[i][1]] < rec.have) { // printf("h:%d\n",rec.have); q.push(rec); lock[temp.i+dir[i][0]][temp.j+dir[i][1]]=rec.have; } } } } if(ans==99999) printf("%d\n",-1); else printf("%d\n",ans); return 0;}int main(){ int t,i,j,k,a,b; scanf("%d",&t); while(t--) { memset(map,0,sizeof(map)); for(i=0;i<100;i++) for(j=0;j<100;j++) lock[i][j]=0; scanf("%d%d",&n,&m); for(i=1;i<=n;i++) for(j=1;j<=m;j++) { scanf("%d",&map[i][j]); if(map[i][j]==2) a=i,b=j; } find_ans(a,b); } return 0;}