一般的模擬題。對於出現過的每一個x建立一個set 集合,對於y也如此。然後查找要走到哪個點即可,主要要對狀態記錄,判斷是否無線循環,否者出現無線循環的情況,就tle了。
#include #include #include #include #include #include #include #include #include #include using namespace std; const int mmax = 500010; const int inf=0x3fffffff; struct node { int x,y; void read() { scanf("%d %d",&x,&y); } node(int x,int y):x(x),y(y) {} node() {} bool operator < (const node &a) const { if(x==a.x) return yqx,qy; set Sx[2100],Sy[2100]; int dir[4][2]={1,0,0,-1,-1,0,0,1}; mapq; bool vis[10100][4]; bool fuck(int x,int y) { int cnt=0; for(int i=0;i<4;i++) { int tx=x+dir[i][0]; int ty=y+dir[i][1]; // if(x==0 && y==0) // { // cout<::iterator it; if(fuck(nowx,nowy)) { fg=0; break; } it=Sy[ qy[nowy] ].upper_bound(nowx); if(it!=Sy[ qy[nowy] ].end()) { int tx=*it; tx--; nowx=tx; nowdir++; nowdir%=4; cnt++; } else break; } else if(nowdir==1) { if(!qx.count(nowx)) break; set::iterator it; if(fuck(nowx,nowy)) { fg=0; break; } it=Sx[ qx[nowx] ].lower_bound(nowy); if(it!=Sx[ qx[nowx] ].begin()) { it--; int ty=*it; ty++; nowy=ty; nowdir++; nowdir%=4; cnt++; } else break; } else if(nowdir==2) { if(!qy.count(nowy)) break; set::iterator it; if(fuck(nowx,nowy)) { fg=0; break; } it=Sy[ qy[nowy] ].lower_bound(nowx); if(it!=Sy[ qy[nowy] ].begin()) { it--; int tx=*it; tx++; nowx=tx; nowdir++; nowdir%=4; cnt++; } else break; } else if(nowdir==3) { if(!qx.count(nowx)) break; set::iterator it; if(fuck(nowx,nowy)) { fg=0; break; } it=Sx[ qx[nowx] ].upper_bound(nowy); if(it!=Sx[ qx[nowx] ].end()) { int ty=*it; ty--; nowy=ty; nowdir++; nowdir%=4; cnt++; } else break; } } if(!fg) puts("-1"); else printf("%d\n",cnt); } return 0; }
從尾到頭打印鏈表,尾到頭打印題目:輸入一個鏈表的頭結點,從尾
C++多重繼承與void*指針轉換問題的分析 C++支持
HDU 2604 Queuing (矩陣快速冪) HD
布爾類型對象可以被賦予文字值true或者fals
[cpp] /* * Co