P1605 迷宫
这道题多次40分的原因就是:存图的mp数组不可以同时标记路线、用于回溯!应该另外用sign数组回溯。
#include<bits/stdc++.h> using namespace std; int n,m,t,sx,sy,fx,fy,z1,z2,ans,dx[4]= {1,-1,0,0},dy[4]= {0,0,1,-1},u,v; bool mp[7][7],sign[7][7]; void dfs(int x,int y) { if(x==fx&&y==fy) { ans++; return; } for(int i=0; i<4; i++) { u=x+dx[i],v=y+dy[i]; if(!sign[u][v]&&!mp[u][v]) { sign[x][y]=1; dfs(u,v); sign[x][y]=0; } } } int main() { for(int i=0; i<=6; i++) for(int j=0; j<=6; j++) mp[i][j]=1; scanf("%d%d%d%d%d%d%d",&n,&m,&t,&sx,&sy,&fx,&fy); for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) mp[i][j]=0; for(int i=1; i<=t; i++) { scanf("%d%d",&z1,&z2); mp[z1][z2]=1; } dfs(sx,sy); printf("%d",ans); return 0; }
还有,回溯时应该在当前位置标记操作,不应在下一位置操作。