存题(搜索)

1.

aoj 0033:https://onlinejudge.u-aizu.ac.jp/problems/0033

 1 #include<bits/stdc++.h>//AOJ 0033
 2 using namespace std;
 3 int ball[11];
 4 bool flag;
 5 void Dfs(int cnt,int left,int right)
 6 {
 7     if(flag) return;
 8     if(cnt==10) 
 9     {
10         flag=true;
11         return;
12         }
13  
14     if(ball[cnt]>left)
15         Dfs(cnt+1,ball[cnt],right);
16     if(ball[cnt]>right)
17         Dfs(cnt+1,left,ball[cnt]);
18 }
19  
20 int main()
21 {
22     int t;
23     while(scanf("%d",&t)==1)
24     {
25         while(t--){
26             flag=false;
27             for(int i=0;i<10;i++)
28                 cin>>ball[i];
29             Dfs(0,0,0);
30             if(flag)
31                 cout<<"YES"<<endl;
32             else
33                 cout<<"NO"<<endl;
34         }
35     }
36     return 0;
37 }

2.aoj 0525:https://onlinejudge.u-aizu.ac.jp/problems/0525

 1 #include<bits/stdc++.h> aoj 0525
 2 using namespace std;
 3 int r,c;
 4 int a[20][10010];
 5 int ans;
 6 void dfs(int step)
 7 {
 8     if(step==r+1)
 9     {
10         int sum=0;
11         int tmp=0;
12         for(register int j=1;j<=c;j++)
13         {
14             for(register int i=1;i<=r;i++)
15             {
16                 if(a[i][j]==1)
17                 {
18                     tmp++;
19                 }
20             }
21             sum+=max(tmp,r-tmp);
22             tmp=0;
23         }
24         ans=max(sum,ans);
25         return ;
26     }
27     dfs(step+1);
28     for(register int i=1;i<=c;i++)
29         a[step][i]=!a[step][i];
30     dfs(step+1);
31 }
32 int main()
33 {
34     while(scanf("%d%d",&r,&c)!=EOF)
35     {
36         if(r==0&&c==0)
37         break;
38         memset(a,0,sizeof(a));
39         ans=0;
40         for(register int i=1;i<=r;i++)
41         {
42             for(register int j=1;j<=c;j++)
43             {
44                 cin>>a[i][j];
45             }
46         }
47         dfs(1);
48         cout<<ans<<endl;
49     }
50     return 0;
51 }

3. poj 3187

http://poj.org/problem?id=3187

 1 #include<iostream>//poj 3187
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<queue>
 5 #include<vector>
 6 #include<algorithm>
 7 using namespace std;
 8 int n,sum;
 9 int a[20];
10 int b[20];
11 int main()
12 {
13     scanf("%d %d",&n,&sum);
14     for(register int i=1;i<=n;i++)
15     {
16         a[i]=i;
17     }
18     do{
19         int tmp=n;
20         for(register int i=1;i<=n;i++)
21         {    
22             b[i]=a[i];
23         }
24         while(tmp!=1)
25         {
26             for(register int i=1;i<tmp;i++)
27             {
28                 b[i]=b[i]+b[i+1];
29             }
30             tmp--;
31         }
32         if(b[1]==sum)
33         break;
34     }while(next_permutation(a+1,a+1+n));
35     for(register int i=1;i<=n;i++)
36     {
37         cout<<a[i]<<" ";
38     }
39     return 0;
40 }

 4. poj 3009

 1 #include<iostream>//poj 3009
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cmath>
 5 using namespace std;
 6 const int N=30;
 7 const int INF=0x3f3f3f3f;
 8 int h,w;
 9 int dir[4][2]=
10 {
11     {-1,0},
12     {0,-1},
13     {1,0},
14     {0,1},
15 };
16 int mp[N][N];
17 int sx,sy;
18 int minn;
19 void dfs(int stx,int sty,int step)
20 {
21     step++;
22     if(step>10)
23     return ;
24     int dx,dy;
25     for(int i=0;i<4;i++)
26     {
27         dx=stx+dir[i][0];
28         dy=sty+dir[i][1];
29         if(mp[dx][dy]==1)
30         continue;
31         while(mp[dx][dy]==0||mp[dx][dy]==2)
32         {
33             dx=dx+dir[i][0];
34             dy=dy+dir[i][1];
35         }
36         if(mp[dx][dy]==-1)
37         continue;
38         if(mp[dx][dy]==1)
39         {
40             mp[dx][dy]=0;
41             dfs(dx-dir[i][0],dy-dir[i][1],step);
42             mp[dx][dy]=1;
43         }
44         if(mp[dx][dy]==3)
45         {
46             if(minn>step)
47             {
48                 minn=step;
49                 continue;   
50             }
51         }
52     }
53 }
54 int main()
55 {
56     while(cin>>w>>h)
57     {
58         if(w==0&&h==0)
59         break;
60         minn=INF;
61         memset(mp,-1,sizeof(mp));
62         for(int i=1;i<=h;i++)
63         {
64             for(int j=1;j<=w;j++)
65             {
66                 cin>>mp[i][j];
67                 if(mp[i][j]==2)
68                 {
69                     sx=i;
70                     sy=j;
71                 }
72             }
73         }
74         dfs(sx,sy,0);
75         if(minn<INF)
76         {
77             cout<<minn<<endl;
78         }
79         else
80         cout<<-1<<endl;
81     }
82     return 0;
83 }

 5. poj 3050:http://poj.org/problem?id=3050

 1 #include<iostream>// poj 3050
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<queue>
 5 #include<vector>
 6 #include<algorithm>
 7 #include<set>
 8 using namespace std;
 9 set<int>s;
10 int mp[10][10];
11 const int n=5;
12 int dir[4][2]=
13 {
14     {-1,0},
15     {0,-1},
16     {1,0},
17     {0,1},
18 };
19 bool check(int tx,int ty)
20 {
21     if(tx<=0||tx>n||ty<=0||ty>n)
22     {
23         return false;
24     }
25     return true;
26 }
27 void dfs(int x,int y,int sum,int step)
28 {
29     if(step==6)
30     {
31         s.insert(sum);
32         return ;
33     }
34     for(register int i=0;i<4;i++)
35     {
36         int newx=x+dir[i][0];
37         int newy=y+dir[i][1];
38         if(check(newx,newy))
39         {
40             dfs(newx,newy,sum*10+mp[newx][newy],step+1);
41         }
42     }
43 }
44 int main()
45 {
46     for(register int i=1;i<=n;i++)
47     {
48         for(register int j=1;j<=n;j++)
49         {
50             scanf("%d",&mp[i][j]);
51         }
52     }
53     for(register int i=1;i<=n;i++)
54     {
55         for(register int j=1;j<=n;j++)
56         {
57             dfs(i,j,mp[i][j],1);
58         }
59     }
60     printf("%d\n",s.size());
61     return 0;
62 }

 

posted @ 2022-07-06 14:29  江上舟摇  阅读(9)  评论(0编辑  收藏  举报