http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2718&cid=1203
题意:给你一个m乘n的格子阵,从一边进去,直线往前走,如果前边有石头就往右走,如果右边还有石头就往左走,如果左边还有石头就忘回走,会给你一个起始点的坐标,当然是在4条边上,但是不会在角上,问你在哪个格子走出去,且走了多少步。
思路:DFS。好吧,当时做的时候卡在这儿,一直没D出来。。。。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=100; int map[maxn][maxn]; int step=1,n,m; void dfs(int x,int y,int flag) { if(flag == 1)//右 { bool flag1 = false; for(int i = x ; i <= n ; i++) { if(map[i][y])//一直走直到前边是石头为止 { flag1 = true ; step += (i-x-1);//把前边走过的都加上但要减去当前占的这个格子,所以减1 if(!map[i-1][y-1])//如果右边没有石头向右转 { dfs(i-1,y,4);//右的右边是下 break;//结束掉每一次的循环,因为有石头之后循环就不应该进行了 } else if(map[i-1][y-1]&&!map[i-1][y+1])//向上 { dfs(i-1,y,2); break; } else if(map[i-1][y-1]&&map[i-1][y+1])//回去 { dfs(i-1,y,3); break; } } } if(!flag1) { step += (n-x); printf("%d %d %d\n",n,y,step); return; } } else if(flag == 2)//上 { bool flag2=false; for(int i = y ; i <= m ; i++) { if(map[x][i]) { flag2 = true ; step += (i-y-1) ; if(!map[x+1][i-1]) { dfs(x,i-1,1); break; } else if(map[x+1][i-1]&&!map[x-1][i-1]) { dfs(x,i-1,3); break; } else if(map[x+1][i-1]&&map[x-1][i-1]) { dfs(x,i-1,4); break; } } } if(!flag2) { step += (m-y); printf("%d %d %d\n",x,m,step); } } else if(flag == 3)//左 { bool flag3 = false; for(int i = x ; i >= 1 ; i--) { if(map[i][y]) { flag3 = true ; step += (x-i-1); if(!map[i+1][y+1]) { dfs(i+1,y,2); break; } else if(map[i+1][y+1]&&!map[i+1][y-1]) { dfs(i+1,y,4); break; } else if(map[i+1][y+1]&&map[i+1][y-1]) { dfs(i+1,y,1); break; } } } if(!flag3) { step += x-1; printf("%d %d %d\n",1,y,step); } } else if(flag == 4)//下 { bool flag4 = false; for(int i = y ; i >= 1 ; i--) { if(map[x][i]) { flag4 = true; step += (y-i-1); if(!map[x-1][i+1]) { dfs(x,i+1,3); break; } else if(map[x-1][i+1]&&!map[x+1][i+1]) { dfs(x,i+1,1); break; } else if(map[x-1][i+1]&&map[x+1][i+1]) { dfs(x,i+1,2); break; } } } if(!flag4) { step += y-1; printf("%d %d %d\n",x,1,step); } } } int main() { int k,sx,sy; int cnt = 1 ; while(scanf("%d%d%d",&n,&m,&k)!=EOF) { if(n==0&&m==0&&k==0) break; step = 1 ;//初始格子算一步 memset(map,0,sizeof(map)); for(int i = 0 ; i < k ; i++) { int x,y; scanf("%d%d",&x,&y); map[x][y] = 1 ;//将这些点标记为1代表不能走 } int flag; scanf("%d %d",&sx,&sy); if(sx == 1) flag = 1 ;//右 else if(sy == 1) flag = 2 ;//上 else if(sy == m) flag = 4 ;//下 else if(sx == n) flag = 3 ;//左 printf("Case %d: ",cnt); cnt++; dfs(sx,sy,flag); } return 0; }