1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| #include <iostream> #define F(n) Fi(i,n) #define Fi(i,n) Fl(i,0,n) #define Fl(i,l,n) for(int i=l;i<n;i++) #define XX x+X[i] #define YY y+Y[i] using namespace std; bool SP[10][10]; char D[10][10]; int C[82][82],n,m,cnt,X[8]={-1,-1,-1,0,1,1,1,0},Y[8]={-1,0,1,1,1,0,-1,-1}; bool ck(int x,int y){ return x<0||x>=n||y<0||y>=m; } int gg(int x,int y,int t){ if(ck(x,y)||D[x][y]>8)return 0; D[x][y]+=t; int tmp=0; if(D[x][y]==0)F(8)if(!ck(XX,YY)&&SP[XX][YY])tmp++,SP[XX][YY]=false; return tmp; } int DFS(int x,int y,int b,int B){ if(y==m){ if(ck(x-1,y-1)||D[x-1][y-1]>8||D[x-1][y-1]==0)DFS(x+1,0,b,B); return 0; } if(x==n){ F(n)Fi(j,m)if(D[i][j]>0&&D[i][j]<=8)return 0; return cnt+=C[B][b]; } if(D[x][y]<=8){ if(ck(x-1,y-1)||D[x-1][y-1]>8||D[x-1][y-1]==0)DFS(x,y+1,b,B); return 0; } bool tag=true,tt=true; F(8)tag&=ck(XX,YY)||D[XX][YY]; F(8)tt&=ck(XX,YY)||D[XX][YY]>8; if(tag&&!tt){ int tmp=0; bool SPB[n][m]; F(n)Fi(j,m)SPB[i][j]=SP[i][j]; F(8)tmp+=gg(XX,YY,-1); D[x][y]++; if(ck(x-1,y-1)||D[x-1][y-1]>8||D[x-1][y-1]==0) if(b>0)DFS(x,y+1,b-1,B-tmp); D[x][y]--; F(8)gg(XX,YY,1); F(n)Fi(j,m)SP[i][j]=SPB[i][j]; }else if(!tag){ bool tmp=SP[x][y];SP[x][y]=false; if(ck(x-1,y-1)||D[x-1][y-1]>8||D[x-1][y-1]==0) if(b<=B-tmp)DFS(x,y+1,b,B-tmp); SP[x][y]=tmp; } if(tag&&(ck(x-1,y-1)||D[x-1][y-1]>8))DFS(x,y+1,b,B); return 0;
} int main(){ ios_base::sync_with_stdio(false); C[0][0]=1; F(81)Fi(j,i+2)C[i+1][j]=C[i][j]+(j?C[i][j-1]:0); int b,B; cin>>n; while(cin>>n>>m>>b){ B=cnt=0; F(n)cin>>D[i]; F(n)Fi(j,m)D[i][j]-='0',SP[i][j]=D[i][j]>8,B+=SP[i][j]; DFS(0,0,b,B); cout<<cnt<<endl; } }
|