题目描述:
在n*m的格子中,某些格子不能通过。现在从左上角的格子出发,每个格子只经过一次,问能否遍历所有的格子。(m,n<7)
分析:
很郁闷的是,一开始的时候以为是欧拉通路的问题。后来发现不是,而是典型的哈密尔顿通路……
我还天真的想,能否通过某种方式转换一下,使原来的节点拆为变来处理。只能是无果而终,因为要是能转换的话,哈密尔顿通路问题也就能转换为欧拉通路问题得到高效的解决,而事实上是impossible的……
哈密尔顿通路问题属于NP完全问题,没有很高效的方法,只能暴力搜索。还有一些剪枝,不过我这里没用上。
/* ZJU2100 Seeding */ #include #include #define clr(a) memset(a,0,sizeof(a)) #define N 10 int n,m; int count,success; char a[N][N]; char b[N][N]; int dir[][2]={{0,1},{1,0},{0,-1},{-1,0}}; void search(int x0,int y0) { int i,j,k; int x,y; count--; b[x0][y0]=1; if(count==0){ success=1; return; } for(k=0;k<4;k++){ x=x0+dir[k][0]; y=y0+dir[k][1]; if(x<0||y<0||x>=n||y>=m) continue; if(a[x][y]=='S'||b[x][y]) continue; search(x,y); } count++; b[x0][y0]=0; } int main() { while(scanf("%d%d/n",&n,&m),n||m) { //init clr(a); clr(b); count=n*m; success=0; //input int i,j; for(i=0;i < n;i++) { gets(a[i]); for(j=0;j < m;j++) if(a[i][j]==apos;Sapos;) count--; } //search search(0,0); //output if(success) puts("YES"); else puts("NO"); } return 0; }