poj3669
2016-07-03 13:43
274 查看
好日狗,这道题首先用queue超时,修改了读取数据的方式,以及将queue变成了两个全局数组。TLE的问题解决了。
在调用solve()的时候总是会崩溃,不明所以,后来发现是特判情况没有很清晰的控制,比如说在0位置如果一开始就被炸了以及最开始就是安全的。
另外,最后总是WA,发现是因为。。手抖。。
另外,注意:
同一个点可能有不同的流星砸到,取min。
启示位置特判
数组适当增大,因为题目中说是流星是0-300,没说人
测试数据:
在调用solve()的时候总是会崩溃,不明所以,后来发现是特判情况没有很清晰的控制,比如说在0位置如果一开始就被炸了以及最开始就是安全的。
另外,最后总是WA,发现是因为。。手抖。。
already[newx][newy]=1写成了
already[newy][newy]=1还非常不好检查。。。
另外,注意:
同一个点可能有不同的流星砸到,取min。
启示位置特判
数组适当增大,因为题目中说是流星是0-300,没说人
测试数据:
23 2 5 10 1 3 5 5 3 12 3 3 9 1 8 7 8 4 15 2 3 7 0 0 2 6 7 10 4 4 10 3 7 7 8 5 13 0 4 9 2 6 8 0 2 4 6 4 12 0 6 7 4 2 10 1 4 7 4 6 10 5 5 12 6 5 14 2 1 2
#include <iostream> #include <queue> #include <string.h> #define INF 0x3f3f3f3f #define N 512 using namespace std; int mat ; bool already ; typedef pair<int,int> P; //queue<P> pos; int qx[N*N]; int qy[N*N]; int head = 0,last = 0; queue<int> _time; int mintime = INF; int dx[4] = {-1,1,0,0}; int dy[4] = {0,0,-1,1}; void solve(){ //while(pos.size()){ while(head<last){ //P p = pos.front(); int curx = qx[head]; int cury = qy[head++]; int t = _time.front(); _time.pop(); //pos.pop(); //cout<<curx<<' '<<cury<<' '<<t<<endl; for(int i=0;i<4;i++){ //int newx = p.first+dx[i]; //int newy = p.second+dy[i]; int newx = curx + dx[i]; int newy = cury + dy[i]; if(newx<0 || newy <0 || newx >=N || newy >=N || already[newx][newy]==true )continue; if(mat[newx][newy]==INF){ mintime = t+1; return; } if(mat[newx][newy]>t+1){ //pos.push(P(newx,newy)); qx[last] = newx; qy[last++] = newy; already[newx][newy]=1; _time.push(t+1); } } } return; } int main(int argc, const char * argv[]) { int i,j,t,row,col,M; cin>>M; memset(mat,0x3f,sizeof(mat)); memset(already,0,sizeof(already)); for(i=0;i<M;i++){ scanf("%d%d%d",&row,&col,&t); if(mat[row][col]==INF || t<mat[row][col])mat[row][col]=t; if((row-1)>=0)mat[row-1][col] = min(t,mat[row-1][col]); if((row+1)<N)mat[row+1][col] = min(t,mat[row+1][col]); if((col-1>=0))mat[row][col-1] = min(t,mat[row][col-1]); if((col+1)<N)mat[row][col+1] = min(t,mat[row][col+1]); } /*for(i=0;i<10;i++){ for(j=0;j<10;j++){ cout.width(10); cout<<mat[i][j]<<' '; } cout<<endl; }*/ if(mat[0][0]==0){ cout<<-1<<endl; }else if(mat[0][0]==INF){ cout<<0<<endl; }else{ already[0][0]=1; //pos.push(pair<int,int>(0,0)); qx[last] = 0; qy[last++] = 0; _time.push(0); solve(); if(mintime==INF)mintime = -1; cout<<mintime<<endl; } return 0; }
相关文章推荐
- 初学ACM - 组合数学基础题目PKU 1833
- POJ ACM 1001
- POJ ACM 1002
- 1611:The Suspects
- POJ1089 区间合并
- POJ 2159 Ancient Cipher
- POJ 2635 The Embarrassed Cryptographe
- POJ 3292 Semi-prime H-numbers
- POJ 2773 HAPPY 2006
- POJ 3090 Visible Lattice Points
- POJ-2409-Let it Bead&&NYOJ-280-LK的项链
- POJ-1695-Magazine Delivery-dp
- POJ1523 SPF dfs
- POJ-1001 求高精度幂-大数乘法系列
- POJ-1003 Hangover
- POJ-1004 Financial Management
- [数论]poj2635__The Embarrassed Cryptographer
- [二分图匹配]poj2446__Chessboard
- POJ1050 最大子矩阵和
- 用单调栈解决最大连续矩形面积问题