很暴力的搜索,还没有什么剪枝......
心得:
【1】如果只查询和修改,用bool比bitset快
【2】rnt在循环中会比int快
【3】减少简单的函数调用
#include<cstdio> #include<cstdlib> #include<bitset> #include<iostream> #define rnt register int using namespace std; int ans[10][10]; char mp[2][10][10];//0表示左右,1表示上下 bool fx[10][10],fy[10][10],fbl[10][10]; void dfs(int x,int y,int bl)//行,列,方格号 { if(bl>9) { for(rnt i=1;i<=9;i++,printf("\n")) for(rnt j=1;j<=9;j++) printf("%d ",ans[i][j]); exit(0); } //真实坐标 int tx=(bl-1)/3*3 +x; int ty=(bl-1)%3*3 +y; int mn=0,mx=10; if(y>1) if(mp[0][tx][ty]=='>') mx=min(mx,ans[tx][ty-1]); else mn=max(mn,ans[tx][ty-1]); if(x>1) if(mp[1][tx][ty]=='v') mx=min(mx,ans[tx-1][ty]); else mn=max(mn,ans[tx-1][ty]); //可选范围 int nxx=x,nxy=y+1,nxbl=bl; if(nxy>3) nxy=1,nxx++; if(nxx>3) nxx=1,nxbl++; for(rnt nm=mn+1;nm<mx;nm++ ) { if(fx[tx][nm] || fy[ty][nm] || fbl[bl][nm] ) continue; ans[tx][ty]=nm; fx[tx][nm] = fy[ty][nm] = fbl[bl][nm] =1; dfs(nxx,nxy,nxbl); fx[tx][nm] = fy[ty][nm] = fbl[bl][nm] =0; ans[tx][ty]=0; } } int main() { for(int i=1;i<=9;i++) { if(i%3!=1) for(int j=1;j<=9;j++) cin>>mp[1][i][j]; for(int k=0;k<3;k++) cin>>mp[0][i][k*3+2]>>mp[0][i][k*3+3]; } dfs(1,1,1); return 0; }