Untitled
unknown
plain_text
2 years ago
4.6 kB
20
Indexable
#define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; int N,M,xstart,ystart,P,A[51][51]; int visit[51][51],f,r,mQ[1000000],ans; int dx[4]={0,0,1,-1}; int dy[4]={1,-1,0,0}; void push(int x){ r++; mQ[r]=x; } int pop(){ f++; return mQ[f]; } void input(){ cin>>N>>M>>xstart>>ystart>>P; for(int i=0;i<N;i++){ for(int j=0;j<M;j++){ visit[i][j]=0; cin>>A[i][j]; } } } void BFS(){ f=r=-1; push(xstart); push(ystart); visit[xstart][ystart]=1; while(f!=r){ int x=pop(); int y=pop(); if(visit[x][y]>P) break; if(A[x][y]==1){ for(int i=0;i<4;i++){ int xx=x+dx[i]; int yy=y+dy[i]; if(xx<0||xx>=N||yy<0||yy>=M||A[xx][yy]==0) continue; if(i==0&&(A[xx][yy]==2||A[xx][yy]==4||A[xx][yy]==5)) continue; if(i==1&&(A[xx][yy]==2||A[xx][yy]==6||A[xx][yy]==7)) continue; if(i==2&&(A[xx][yy]==3||A[xx][yy]==5||A[xx][yy]==6)) continue; if(i==3&&(A[xx][yy]==3||A[xx][yy]==4||A[xx][yy]==7)) continue; if(visit[xx][yy]==0){ visit[xx][yy]=visit[x][y]+1; push(xx);push(yy); }else if(visit[xx][yy]>visit[x][y]+1){ visit[xx][yy]=visit[x][y]+1; push(xx);push(yy); } } }else if(A[x][y]==3){ for(int i=0;i<2;i++){ int xx=x+dx[i]; int yy=y+dy[i]; if(xx<0||xx>=N||yy<0||yy>=M||A[xx][yy]==0) continue; if(i==0&&(A[xx][yy]==2||A[xx][yy]==4||A[xx][yy]==5)) continue; if(i==1&&(A[xx][yy]==2||A[xx][yy]==6||A[xx][yy]==7)) continue; if(visit[xx][yy]==0){ visit[xx][yy]=visit[x][y]+1; push(xx);push(yy); }else if(visit[xx][yy]>visit[x][y]+1){ visit[xx][yy]=visit[x][y]+1; push(xx);push(yy); } } }else if(A[x][y]==2){ for(int i=2;i<4;i++){ int xx=x+dx[i]; int yy=y+dy[i]; if(xx<0||xx>=N||yy<0||yy>=M||A[xx][yy]==0) continue; if(i==2&&(A[xx][yy]==3||A[xx][yy]==5||A[xx][yy]==6)) continue; if(i==3&&(A[xx][yy]==3||A[xx][yy]==4||A[xx][yy]==7)) continue; if(visit[xx][yy]==0){ visit[xx][yy]=visit[x][y]+1; push(xx);push(yy); }else if(visit[xx][yy]>visit[x][y]+1){ visit[xx][yy]=visit[x][y]+1; push(xx);push(yy); } } }else if(A[x][y]==6){ for(int i=1;i<3;i++){ int xx=x+dx[i]; int yy=y+dy[i]; if(xx<0||xx>=N||yy<0||yy>=M||A[xx][yy]==0) continue; if(i==1&&(A[xx][yy]==2||A[xx][yy]==6||A[xx][yy]==7)) continue; if(i==2&&(A[xx][yy]==3||A[xx][yy]==5||A[xx][yy]==6)) continue; if(visit[xx][yy]==0){ visit[xx][yy]=visit[x][y]+1; push(xx);push(yy); }else if(visit[xx][yy]>visit[x][y]+1){ visit[xx][yy]=visit[x][y]+1; push(xx);push(yy); } } }else if(A[x][y]==5){ for(int i=0;i<3;i++){ if(i==1) continue; int xx=x+dx[i]; int yy=y+dy[i]; if(xx<0||xx>=N||yy<0||yy>=M||A[xx][yy]==0) continue; if(i==0&&(A[xx][yy]==2||A[xx][yy]==4||A[xx][yy]==5)) continue; if(i==2&&(A[xx][yy]==3||A[xx][yy]==5||A[xx][yy]==6)) continue; if(visit[xx][yy]==0){ visit[xx][yy]=visit[x][y]+1; push(xx);push(yy); }else if(visit[xx][yy]>visit[x][y]+1){ visit[xx][yy]=visit[x][y]+1; push(xx);push(yy); } } }else if(A[x][y]==4){ for(int i=0;i<4;i++){ if(i==1||i==2) continue; int xx=x+dx[i]; int yy=y+dy[i]; if(xx<0||xx>=N||yy<0||yy>=M||A[xx][yy]==0) continue; if(i==0&&(A[xx][yy]==2||A[xx][yy]==4||A[xx][yy]==5)) continue; if(i==3&&(A[xx][yy]==3||A[xx][yy]==4||A[xx][yy]==7)) continue; if(visit[xx][yy]==0){ visit[xx][yy]=visit[x][y]+1; push(xx);push(yy); }else if(visit[xx][yy]>visit[x][y]+1){ visit[xx][yy]=visit[x][y]+1; push(xx);push(yy); } } }else { for(int i=1;i<4;i++){ if(i==2) continue; int xx=x+dx[i]; int yy=y+dy[i]; if(xx<0||xx>=N||yy<0||yy>=M||A[xx][yy]==0) continue; if(i==1&&(A[xx][yy]==2||A[xx][yy]==6||A[xx][yy]==7)) continue; if(i==3&&(A[xx][yy]==3||A[xx][yy]==4||A[xx][yy]==7)) continue; if(visit[xx][yy]==0){ visit[xx][yy]=visit[x][y]+1; push(xx);push(yy); }else if(visit[xx][yy]>visit[x][y]+1){ visit[xx][yy]=visit[x][y]+1; push(xx);push(yy); } } } } } int main(int argc, char** argv) { int test_case; int T; freopen("input.txt", "r", stdin); cin >> T; for(test_case = 1; test_case <= T; ++test_case) { input(); ans=0; BFS(); for(int i=0;i<N;i++){ for(int j=0;j<M;j++){ if(visit[i][j]>0&&visit[i][j]<=P) ans++; } } cout << "Case #" << test_case << endl << ans << endl; } return 0; }
Editor is loading...