标签:
#include <iostream> #include <cstdio> #include <string.h> #include <vector> #include <algorithm> using namespace std; const int INF=100000000; int nrows,ncols; int G[10][10]; struct State { int up[9]; int left; int encode()const { int key=left; for(int i=0; i<ncols; i++) key=key*3+up[i]; return key; } bool next(int row, int col, int U, int D, int L, int R, State &T)const { if( row==nrows-1 && D != 0) return false; //最下行不能有向下的插头 if( col==ncols-1 && R !=0 ) return false; //最右列右边不能有插头 int must_left=(col>0&&left!=0);// 是否必须要左插头 int must_up =(row>0&&up[col]!=0);//是否必须要右插头 if((must_left!=0 && L!=left ) || (must_left==0 && L!=0 )) return false;//左插头不匹配 if((must_up !=0 && U!=up[col])||(must_up==0 && U!=0 ) ) return false;//上插头不匹配 if(must_left && must_up && left!=up[col]) return false; for(int i=0; i<ncols; i++)T.up[i]=up[i]; T.up[col]=D; T.left=R; return true; } }; int memo[9][9][59049]; int rec(int row, int col, const State &S) { if(col==ncols){ col=0; row++;}; if(row==nrows)return 0; int key=S.encode(); int &res = memo[row][col][key]; if(res>=0)return res; res=INF; State T; if(G[row][col]<=1) { if(S.next(row,col,0,0,0,0,T))res=min(res,rec(row,col+1,T)); if(G[row][col]== 0) for(int t=1; t<=2 ; t++) { if(S.next(row,col,t,t,0,0,T))res=min(res,rec(row,col+1,T)+2); if(S.next(row,col,t,0,t,0,T))res=min(res,rec(row,col+1,T)+2); if(S.next(row,col,t,0,0,t,T))res=min(res,rec(row,col+1,T)+2); if(S.next(row,col,0,t,t,0,T))res=min(res,rec(row,col+1,T)+2); if(S.next(row,col,0,t,0,t,T))res=min(res,rec(row,col+1,T)+2); if(S.next(row,col,0,0,t,t,T))res=min(res,rec(row,col+1,T)+2); } } else { int t=G[row][col]-1; if(S.next(row,col,t,0,0,0,T))res=min(res,rec(row,col+1,T)+1); if(S.next(row,col,0,t,0,0,T))res=min(res,rec(row,col+1,T)+1); if(S.next(row,col,0,0,t,0,T))res=min(res,rec(row,col+1,T)+1); if(S.next(row,col,0,0,0,t,T))res=min(res,rec(row,col+1,T)+1); } return res; } int main() { while(scanf("%d%d",&nrows,&ncols)==2&&nrows&&ncols) { for(int i=0; i<nrows; i++) for(int j=0; j<ncols; j++) scanf("%d",&G[i][j]); State S; memset(&S,0,sizeof(S)); memset(memo,-1,sizeof(memo)); int ans=rec(0,0,S); if(ans==INF)ans=0; printf("%d\n",ans/2); } return 0; }
标签:
原文地址:http://www.cnblogs.com/Opaser/p/4945603.html