HDU 1035 Robot Motion

 

codeforce挂掉了,做着题目跑过来写下题解。

搜索题,典型的广搜。其实只是广搜的模型而已

回头看看这题,不是搜索,是模拟题,做题太快了,不考虑很多问题,直接干了。

用到了队列记录,用map做记录标记已找过。方法很多

如果接触过这类型的,应该很简单。

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <queue>
 4 #include <map>
 5 using namespace std;
 6 
 7 map<int,int> mp;
 8 int maz[15][15];
 9 int n,m,st;
10 void dir(int p,int s,int t,int &a,int &b)
11 {
12     if(p=='S') a=s+1,b=t;
13     if(p=='W') a=s,b=t-1;
14     if(p=='E') a=s,b=t+1;
15     if(p=='N') a=s-1,b=t;
16 }
17 int is_out(int nx,int ny){
18     if(nx < 0 || nx >= n || ny < 0 || ny >= m) return 1;
19     return 0;
20 }
21 #include <iostream>
22 int main()
23 {
24     while(scanf("%d %d",&n,&m) , n+m)
25     {
26         scanf("%d",&st);
27         mp.clear();
28         st--;
29         for(int i=0;i<n;i++)
30         {
31             char s[15];
32             scanf("%s",s);
33             for(int j=0;j<m;j++)
34             {
35                 maz[i][j] = s[j];
36             }
37         }
38         int cnt = 1;
39         int sta = st;
40         queue<int> q;
41         q.push(sta);
42         mp[sta]=1;
43         while(!q.empty())
44         {
45             int nx,ny;
46             int next = q.front();q.pop();
47             int kx=next/m,ky=next%m;
48             dir(maz[kx][ky],kx,ky,nx,ny);
49             //cout<<nx<<ny;
50             if(is_out(nx,ny))
51             {
52                 printf("%d ",cnt);
53                 printf("step(s) to exit\n");
54                 break;
55             }
56             else if(mp[nx*m+ny])
57             {
58                 printf("%d step(s) before a loop of %d step(s)\n"
59                     ,mp[nx*m+ny]-1,cnt-mp[nx*m+ny]+1);
60                 break;
61             }
62             mp[nx*m+ny] = ++cnt;
63             q.push(nx*m+ny);
64         }
65     }
66     return 0;
67 }
View Code

 

posted on 2013-11-23 15:56  从此以后  阅读(225)  评论(0)    收藏  举报