跳过正文
  1. Posts/

poj 2688 Cleaning Robot (tsp问题)

·542 字·2 分钟

______

好蠢,竟然没看出来这道题的不同之处,以为就是个搜

然后样例什么的都过了…

结果显然 WA…

然后才发现,这道题应该是 tsp 问题。

解法是先跑一遍 bfs,

对于所有的脏点和起点,得到每两个点之间的距离。

然后跑一遍 dfs,枚举出所有的组合,同时更新答案。

晚安。

代码实现
  1/*************************************************************************
  2	> File Name: code/poj/rr2688.cpp
  3	> Author: 111qqz
  4	> Email: rkz2013@126.com
  5	> Created Time: 2015年08月16日 星期日 03时39分34秒
  6 ************************************************************************/
  7
  8#include<iostream>
  9#include<iomanip>
 10#include<cstdio>
 11#include<algorithm>
 12#include<cmath>
 13#include<cstring>
 14#include<string>
 15#include<map>
 16#include<set>
 17#include<queue>
 18#include<vector>
 19#include<stack>
 20#define y0 abc111qqz
 21#define y1 hust111qqz
 22#define yn hez111qqz
 23#define j1 cute111qqz
 24#define tm crazy111qqz
 25#define lr dying111qqz
 26using namespace std;
 27#define REP(i, n) for (int i=0;i<int(n);++i)
 28typedef long long LL;
 29typedef unsigned long long ULL;
 30const int inf = 0x7fffffff;
 31const int N=25;
 32int w,h;
 33char maze[N][N];
 34int dist[N][N];
 35int cnt;//机器人与脏地的个数
 36int tag[N][N];//标记
 37bool vist[N][N];
 38struct node
 39{
 40    int x,y;
 41    int step;
 42    bool ok ()
 43    {
 44	if (x<1||x>h||y<1||y>w||vist[x][y]||maze[x][y]=='x')
 45	    return false;
 46	return true;
 47    }
 48}pos[N*N];
 49
 50node robot;
 51int dir[4][2]={0,-1,0,1,-1,0,1,0};
 52void bfs(node p,int po)
 53{
 54    vist[p.x][p.y]=1;
 55    queue<node>q;
 56    q.push(p);
 57    while(!q.empty())
 58    {
 59        node cur=q.front();
 60        q.pop();
 61        if(maze[cur.x][cur.y]=='o' || maze[cur.x][cur.y]=='*')
 62            dist[po][tag[cur.x][cur.y]]=cur.step;
 63        node next;
 64        next.step=cur.step+1;
 65        for(int i=0;i<4;i++)
 66        {
 67            next.x=cur.x+dir[i][0];
 68            next.y=cur.y+dir[i][1];
 69            if(!next.ok())
 70                continue;
 71            q.push(next);
 72            vist[next.x][next.y]=1;
 73        }
 74    }
 75}
 76
 77int ans=inf;
 78bool vis[N];
 79void dfs(int x,int step,int s)
 80{
 81    if(step==cnt)
 82    {
 83        if(s<ans)
 84            ans=s;
 85        return ;
 86    }
 87    if(s>ans)
 88        return ;
 89    for(int j=1;j<=cnt;j++)
 90    {
 91        if(vis[j])
 92            continue;
 93        vis[j]=1;
 94        dfs(j,step+1,s+dist[x][j]);
 95        vis[j]=0;
 96    }
 97}
 98
 99int main()
100{
101    while(~scanf("%d%d",&w,&h))
102    {
103        if(w==0&&h==0)
104            break;
105       // getchar();
106        cnt=0;
107        memset(pos,0,sizeof(pos));
108        memset(tag,0,sizeof(tag));
109        for(int i=1;i<=h;i++)
110        {
111            scanf("%s",maze[i]+1);
112            for(int j=1;j<=w;j++)
113                if (maze[i][j]=='o')
114                {
115                     pos[++cnt].x=i;
116                    pos[cnt].y=j;
117                    robot.x=i;
118                    robot.y=j;
119                    tag[i][j]=cnt;
120                }
121                else if(maze[i][j]=='*')
122                {
123                     pos[++cnt].x=i;
124                    pos[cnt].y=j;
125                    tag[i][j]=cnt;
126                }
127        }
128        for(int i=1;i<=cnt;i++)
129            for(int j=1;j<=cnt;j++)
130                if(i !=j)
131                    dist[i][j]=inf;
132                else
133                    dist[i][j]=0;
134        for(int i=1;i<=cnt;i++)
135        {
136            memset(vist,0,sizeof(vist));
137            pos[i].step=0;
138            bfs(pos[i],i);
139        }
140        bool flag=1;
141        for(int i=1;i<=cnt && flag;i++)
142            for(int j=1;j<=cnt && flag;j++)
143                if(dist[i][j]==inf)
144                     flag=0;
145
146        if(flag==0)
147        {
148            puts("-1");
149            continue;
150        }
151        memset(vis,0,sizeof(vis));
152        vis[tag[robot.x][robot.y]]=1;
153        ans=inf;
154        dfs(tag[robot.x][robot.y],1,0);
155        printf("%d\n",ans);
156
157    }
158    return 0;
159}

相关文章

hdu 5305 Friends (dfs)

·314 字·1 分钟
dfs 1A 代码实现 1/************************************************************************* 2 > File Name: code/whust/#9/K.cpp 3 > Author: 111qqz 4 > Email: rkz2013@126.com 5 > Created Time: 2015年08月05日 星期三 15时02分30秒 6 ************************************************************************/ 7 8#include<iostream> 9#include<iomanip> 10#include<cstdio> 11#include<algorithm> 12#include<cmath> 13#include<cstring> 14#include<string> 15#include<map> 16#include<set> 17#include<queue> 18#include<vector> 19#include<stack> 20#define y0 abc111qqz 21#define y1 hust111qqz 22#define yn hez111qqz 23#define j1 cute111qqz 24#define tm crazy111qqz 25#define lr dying111qqz 26using namespace std; 27#define REP(i, n) for (int i=0;i<int(n);++i) 28typedef long long LL; 29typedef unsigned long long ULL; 30const int inf = 0x7fffffff; 31int n ,m,ans; 32int d[50]; 33int on[50],off[50]; 34int u[50],v[50]; 35 36bool ok(int x,int y) 37{ 38 if ( !d[x] && !d[y] && on[x] == off[x] && on[y] == off[y] ) 39 return true; 40 if ( !d[x] && d[y] && on[x] == off[x] ) 41 return true; 42 if ( d[x] && !d[y] && on[y] == off[y] ) 43 return true; 44 if ( d[x] && d[y] ) 45 return true; 46 return false; 47} 48 49void dfs ( int i) 50{ 51 if (i==m) 52 { 53 ans++; 54 return; 55 } 56 int x = u[i]; 57 int y = v[i]; 58 d[x]--; 59 d[y]--; 60 on[x]++; 61 on[y]++; 62 if (ok(x,y)) 63 dfs (i+1); 64 on[x]--;on[y]--; 65 off[y]++;off[x]++; 66 if ( ok( x,y)) 67 dfs (i+1); 68 off[y]--; 69 off[x]--; 70 d[x]++; 71 d[y]++; 72} 73 74int main ( ) 75{ 76 int T; 77 cin>>T; 78 while ( T-- ) 79 { 80 ans = 0; 81 scanf ("%d %d",&n,&m); 82 memset (d,0,sizeof(d)); 83 memset (on,0,sizeof(on)); 84 memset (off,0,sizeof(off)); 85 for ( int i = 0 ; i < m ; i++ ) 86 { 87 scanf ("%d%d",&u[i],&v[i]); 88 d[u[i]]++; 89 d[v[i]]++; 90 } 91 dfs (0); 92 printf ( "%d\n" , ans ); 93 } 94}

uva 12442 . Forwarding Emails

·579 字·2 分钟
“… so forward this to ten other people, to prove that you believe the emperor has 题意是说发短信,每个人只会给一个人发,问从哪个人开始发,能传到的人最多