hdu 1175 連連看(搜尋)
阿新 • • 發佈:2018-12-31
上週實驗課上學妹問我的題目,當時我寫了個dfs,結果一直爆棧。今天又把程式碼重新看了一下,程式碼有一些小問題,修改之後又加了兩個剪枝A掉。
#include<stdio.h> #include<string.h> #define N 1005 int map[N][N],mark[N][N]; int dir[4][2]= {0,1,0,-1,1,0,-1,0}; int n,m; int x1,y1,x2,y2; int judge(int x,int y) { if(x<1||x>n||y<1||y>m) return 0; if(mark[x][y]==1||map[x][y]!=0) return 0; return 1; } int dfs(int x,int y,int count,int fx) { if(count>2) return 0; if(x==x2&&y==y2&&count<=2) return 1; else if(x==x2&&y==y2) return 0; int i; for(i=0; i<4; i++) { int xx,yy; xx=x+dir[i][0]; yy=y+dir[i][1]; if(judge(xx,yy)) { if(i!=fx) { if(xx!=x2&&yy!=y2&&count>=1) continue;///檢查下一個需要dfs的點和終點之間是否需要轉彎,如果需要且count大於等於1,直接continue掉。 mark[xx][yy]=1; if(dfs(xx,yy,count+1,i)) return 1; mark[xx][yy]=0; } else { if(xx!=x2&&yy!=y2&&count>=2) continue;///檢查下一個需要dfs的點和終點之間是否需要轉彎,如果需要且count大於等於2,直接continue掉。 mark[xx][yy]=1; if(dfs(xx,yy,count,i)) return 1; mark[xx][yy]=0; } } } return 0; } int main() { while(scanf("%d%d",&n,&m),n+m) { int i,j; memset(map,0,sizeof(map)); for(i=1; i<=n; i++) { for(j=1; j<=m; j++) scanf("%d",&map[i][j]); } int k; scanf("%d",&k); while(k--) { scanf("%d%d%d%d",&x1,&y1,&x2,&y2); if(map[x1][y1]!=map[x2][y2]||map[x1][y1]==0||map[x2][y2]==0||x1==x2&&y1==y2) { printf("NO\n"); continue; } int temp=map[x2][y2]; map[x2][y2]=0; memset(mark,0,sizeof(mark)); mark[x1][y1]=1; int flag=0; for(i=0; i<4; i++) { int xx,yy; xx=x1+dir[i][0]; yy=y1+dir[i][1]; if(judge(xx,yy)) { mark[xx][yy]=1; if(dfs(xx,yy,0,i)) { flag=1; break; } mark[xx][yy]=0; } } if(flag) printf("YES\n"); else printf("NO\n"); map[x2][y2]=temp; } } return 0; }