noi寒假刷题之旅_ 2.5基本算法之搜索(36题)

»2.5基本算法之搜索(36题)


 

1159:Maze

#include<iostream>
#include<cstring>
#define MAX 22
/*
用dfs会出现先到达终点,但是钥匙没找完的情况 
*/
using namespace std;
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
int n,M;
char t[MAX][MAX];
int  vis[MAX][MAX];
struct Pos 
{
	int x,y;
} s,m[5];
int key[5],r[5],locx[5],locy[5],flag=0;
bool check() 
{
	for(int i=0; i<5; i++)
		if(key[i]!=r[i])
			return 1;
	return 0;
}
void DFS(int posi,int posj)
{
	if(t[posi][posj]=='G') {	flag=1;return;	}
	if(('A'<=t[posi][posj]&&t[posi][posj]<='E')||t[posi][posj]=='X'||posi<=0||posi>M||posj<=0||posj>n){ return; }
	if('a'<=t[posi][posj]&&t[posi][posj]<='e')	
	{	
		key[t[posi][posj]-'a']--;
		if(!key[t[posi][posj]-'a']) t[locx[t[posi][posj]-'a']][locy[t[posi][posj]-'a']]='.';
		t[posi][posj]='.';
//		if(!key[t[posi][posj]-'a']) t[m[t[posi][posj]-'a'].x][m[t[posi][posj]-'a'].y]='.';
	}
	for(int i=0;i<4;++i)
	{
		if(vis[dx[i]+posi][dy[i]+posj]) continue; 
		else vis[dx[i]+posi][dy[i]+posj]=1;
		DFS(dx[i]+posi,dy[i]+posj);
		if(flag) return;
	}
}
void inti()
{
	memset(t,'X',sizeof(t));
	memset(vis,0,sizeof(vis));
	memset(key,0,sizeof(key));
	memset(r,0,sizeof(r));
	memset(m,0,sizeof(m));
	flag=0;
}
int main()
{
	while(~scanf("%d%d",&M,&n))
	{
		if(M==0&&n==0) break;
		for(int i=1;i<=M;++i)
		{
			getchar();
			for(int j=1;j<=n;++j)
			{
				cin>>t[i][j];
				if(t[i][j]=='S'){ s.x=i;s.y=j; }
				if('a'<=t[i][j]&&t[i][j]<='e'){	key[t[i][j]-'a']++; }//保存一下每种钥匙的数量 
				if(t[i][j]>='A'&&t[i][j]<='E') locx[t[i][j]-'A']=i,locy[t[i][j]-'A']=j; //存放每一个门的位置 
//				if('A'<=t[i][j]&&t[i][j]<='E'){ m[t[i][j]-'A'].x=i; m[t[i][j]-'A'].y=j; 	}//保存一下门的位置 
			}
		}
		
		do
		{
			memcpy(r,key,sizeof(r));
			memset(vis,0,sizeof(vis));
			DFS(s.x,s.y);
		}while(check());
		if(flag){		cout<<"YES\n";	}
		else	{		cout<<"NO\n";	    }	
		inti();
	}
	return 0;	
} 

1253:Dungeon Master_三维

#include<iostream>
#include<queue>
#include<stdio.h>
#include<cstring>
#define MAX 35
using namespace std;
int l,r,c,re;
char mep[MAX][MAX][MAX];
int vis[MAX][MAX][MAX];
int dir[6][3]={{0,0,1},{0,0,-1},{0,1,0},{0,-1,0},{1,0,0},{-1,0,0}};
struct node
{
	int x,y,z,step;
};
struct node e,start;
bool check(node t)
{
	if(t.x<0||t.x>=l||t.y<0||t.z<0||t.y>=r||t.z>=c) return true;
	else if(vis[t.x][t.y][t.z]) return true;
	else if(mep[t.x][t.y][t.z]=='#') return true;
    return false;
}
int  bfs()
{
	queue<node> Q;
	start.step = 0;
	Q.push(start);
	vis[start.x][start.y][start.z]=1;
	while(!Q.empty())
	{
		node t=Q.front();Q.pop();
		if((t.x == e.x)&&(t.y == e.y)&&(t.z == e.z)) return t.step;
		for(int i=0;i<6;++i)
		{
		    node temp;temp=t;
			temp.x = t.x+dir[i][0],temp.y = t.y+dir[i][1],temp.z =t.z+ dir[i][2];
			if(!check(temp))
            {
                vis[temp.x][temp.y][temp.z]=1;
                temp.step++;
                Q.push(temp);
            }
		}
	}
	return 0;
}
int main()
{
	while(scanf("%d%d%d",&l,&r,&c)&&(l||r||c))
	{
	    memset(vis,0,sizeof(vis));
	    memset(mep,'#',sizeof(mep));
		for(int i=0;i<l;++i)
			for(int j=0;j<r;++j)
			{
				scanf("%s",mep[i][j]);
				for(int k=0;k<c;++k)
				{
					if(mep[i][j][k]=='E') {	e.x=i;e.y=j;e.z=k; }
					if(mep[i][j][k]=='S') { start.x=i;start.y=j;start.z=k;	}
				}
			}
		re = bfs();
		if(re)  cout<<"Escaped in "<<re<<" minute(s).\n";
		else cout<<"Trapped!\n";
	}
}

131:Channel Allocation

#include<iostream>
#include<string.h>
#include<string>
#include<vector>
#define MAX 27
using namespace std;
typedef struct s
{
    int num;//数字
    int color;//数字对应的颜色
}Color;
vector<Color>c[MAX];
Color mark[MAX];
int n=0;
string temp;
int vis[MAX];
void intial()
{
    memset(vis,0,sizeof(int)*4);
    memset(mark,0,sizeof(Color)*MAX);
    for(int i=0;i<MAX;++i)c[i].clear();    
    temp="";
}
bool End()
{
    for(int i=0;i<n;++i)
    {
        if(!mark[i].color)return false;
    }
    return true;
}
int max;
void dfs(int index)
{
    if(index==n)return;//如果遍历完最后一个就结束
    if(End())return;//是否涂色完毕
    if(c[index].size()!=1)//只有头
    {    
        int Color_num[5]={};
        for(int i=1;i<c[index].size();++i)
            if(mark[c[index][i].num].color) 
            {
                Color_num[mark[c[index][i].num].color]=1;
            }
            //找一下周围的颜色有哪些,然后把它们去除 
        for(int i=1;i<=4;++i)
        {
            if(!Color_num[i])
            {
                if(End())return;
                mark[c[index][0].num].color=i;//涂色                         
                dfs(index+1);
            }
        }
    }
    else
    {
        if(End())return;
        dfs(index+1);
    }
    return;
}
int main()
{
    while(cin>>n&&n)
    {
        intial();
        for(int j=0;j<n;++j)
        {
            cin>>temp;
            Color now;now.num=temp[0]-'A';
            c[j].push_back(now);//数组第一位放头 
            mark[now.num].num=now.num; 
            for(int i=2;i<temp.length();++i)
            {
                now.num=temp[i]-'A';
                c[j].push_back(now);
            }    
        }
        dfs(0);//传入数组第一个
        int count=mark[0].color;
        for(int i=1;i<n;++i)
        {
            if(count<mark[i].color) count=mark[i].color;
        } 
        if(count)
        {
            if(count==1)cout<<"1 channel needed."<<endl; 
            else cout<<count<<" channels needed."<<endl;   
        }
        else
        {
            if(n==2)cout<<"1 channel needed."<<endl; 
            if(n==3)cout<<"3 channels needed."<<endl; 
            if(n>=4) cout<<"4 channels needed."<<endl; 
        }        
    }
    
    return 0;
}

1388:Lake Counting

#include<iostream>
#include<string.h>
#include<string>
#include<queue>
#define MAX 102
using namespace std;
string mark[MAX];
int vis[MAX][MAX],ans,n,m,flag;
int dir[8][2]={{0,1},{0,-1},{1,0},{-1,0},{1,1},{-1,-1},{1,-1},{-1,1}};
struct node
{
    int x,y;
};
bool Check(node t)
{
    if(t.x<0||t.y<0||t.x>=n||t.y>=m) return false;
    else if(vis[t.x][t.y]) return false;
    else if(mark[t.x][t.y]=='W') return true;
    else return false;
}
void bfs(node start)
{
    queue<node> Q;
    Q.push(start);
    vis[start.x][start.y]=1;
    while(!Q.empty())
    {
        node t = Q.front();Q.pop();
        for(int i=0;i<8;++i)
        {
            node newt;
            newt.x = t.x+dir[i][0],newt.y=t.y+dir[i][1];
            if(Check(newt))
            {
               vis[newt.x][newt.y]=1;
               mark[newt.x][newt.y]='.';
               Q.push(newt);
            }
        }
    }
}
int main()
{
    cin>>n>>m;
    memset(vis,0,sizeof(vis));
    for(int j=0;j<n;++j) cin>>mark[j];
    for(int i=0;i<n;++i)
        for(int j=0;j<m;++j)
            if(mark[i][j]=='W')
            {
                node s;ans++;
                s.x=i,s.y=j;
                bfs(s);
            }
    cout<<ans;
    return 0;
}

1490:A Knight's Journey

#include<iostream>
#include<string.h>
#include<string>
#include<stdio.h>
#include<queue>
#define MAX 102
using namespace std;
struct node{
    int x,y;
};
node re[MAX];//放坐标
int vis[MAX][MAX],len=1,ans,n,flag,a,b;
int dir[8][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2} };
bool Check(node t)
{
    if(t.x<1||t.y<1||t.x>a||t.y>b) return false;
    else if(vis[t.x][t.y]) return false;
    else return true;
}
void dfs(node start,int num)
{
   if(!flag)
   {
       re[num].x=start.x,re[num].y=start.y;
       if(num==a*b)
       {
           flag=1;return ;
       }
   }
   node t;
   for(int i=0;i<8;++i)
   {
        t.x = start.x+dir[i][0],t.y = start.y+dir[i][1];
        if(Check(t))
        {
            vis[start.x][start.y]=1;
            dfs(t,num+1);
            vis[start.x][start.y]=0;
        }
   }
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;++i)
    {
        memset(vis,0,sizeof(vis));
        flag=0;
        cin>>a>>b;
        re[1].x=1,re[1].y=1;
        cout<<"Scenario #"<<i<<":\n";
        dfs(re[1],1);
        if(flag)
        {
            for(int j=1;j<=a*b;++j) printf("%c%d",re[j].y+64,re[j].x);
            cout<<"\n\n";
        }
        else
        {
            cout<<"impossible\n\n";
        }
    }
    return 0;
}

156:LETTERS

#include<iostream>
#include<queue>
#include<string>
#define MAX 25
using namespace std;
int n,k;
int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int v[MAX][MAX];
int vv[26];
string m[MAX];
int ans;
bool Check(int x,int y)
{
    if(x<0||x>=n||y<0||y>=k) return false;
    else if(v[x][y]) return false;
    else if(vv[m[x][y]-'A']) return false;
    else return true;
}
void dfs(int x,int y,int step)
{
//   cout<<"\t\t\t\t>>("<<x<<","<<y<<")\n";
//   for(int i=0;i<n;++i)
//   {
//       for(int j=0;j<k;++j)
//       {
//           cout<<v[i][j];
//       }
//        cout<<endl;
//   }
    if(step>ans) ans=step;
   for(int i=0;i<4;++i)
   {
       int newx,newy;
       newx = x+dir[i][0],newy = y+dir[i][1];
       if(Check(newx,newy))
       {
           v[newx][newy]=1;
           vv[m[newx][newy]-'A']=1;
           step++;
           dfs(newx,newy,step);
           step--;
           v[newx][newy]=0;
           vv[m[newx][newy]-'A']=0;
       }
   }
//   cout<<"\t\t\t\t<<("<<x<<","<<y<<")\n";
}
int main()
{
    cin>>n>>k;
    for(int i=0;i<n;++i)cin>>m[i];
    v[0][0]=1;vv[m[0][0]-'A']=1;
    dfs(0,0,1);
    cout<<ans;
    return 0;
}

166:The Castle

#include<iostream>
#define MAX 55
using namespace std;
int n,m,t;
int dir[4][2]={
    {0,1},
    {1,0},
    {0,-1},
    {-1,0}
    };//西北东南
struct node
{
    int w[4];
};
int v[MAX][MAX];
node mep[MAX][MAX];
int coun=0,maxs=1;
bool Check(int x,int y)
{
    if(x<1||x>n||y<1||y>m)return false;
    else if(v[x][y]) return false;
    else return true;
}
int spare;
void dfs(int x,int y)
{
    if(spare>maxs) maxs=spare;
//    cout<<"空间大小:"<<spare<<endl;
//    for(int i=1;i<=n;++i)
//    {
//        for(int j=1;j<=m;++j)
//        {
//            cout<<v[i][j];
//        }
//        cout<<endl;
//    }
    for(int i=0;i<4;++i)
    {
        int newx,newy;
        newx=x+dir[i][0],newy=y+dir[i][1];
        if(Check(newx,newy)&&!mep[newx][newy].w[i])
        {
            v[newx][newy]=1;spare+=1;
            dfs(newx,newy);
        }
    }

}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;++i)
        for(int j=1;j<=m;++j)
        {
            cin>>t;
            if(t&1) mep[i][j].w[0]=1;//西
            if(t&2) mep[i][j].w[1]=1;//北
            if(t&4) mep[i][j].w[2]=1;//东
            if(t&8) mep[i][j].w[3]=1;//南
        }
    for(int i=1;i<=n;++i)
        for(int j=1;j<=m;++j)
            if(!v[i][j])
            {
                v[i][j]=1;
                ++coun;spare=1;
//                cout<<"       >>"<<"("<<i<<","<<j<<")"<<endl;
                dfs(i,j);
//                cout<<"       <<"<<"("<<i<<","<<j<<")"<<endl;
            }
    cout<<coun<<endl<<maxs;
    return 0;
}

1700:八皇后问题

#include<iostream>
#include<cmath>
#include<string.h>
using namespace std;
int n=8,tot;
int col[8]={0};
bool check(int c,int r)
{
    for(int i=0;i<r;++i)
    {
        if(col[i]==c||(abs(col[i]-c)==abs(i-r)))
        {
            return false;
        }
    }
    return true;
}
void DFS(int r)
{
    if(r==n)
    {
        cout<<"No. "<<++tot<<endl;
        int i,j;
        for(i=0;i<8;++i)
        {
            for(j=0;j<8;++j)
            {
                if(i==col[j])
                {
                    if(j==7)cout<<1;
                    else cout<<1<<" ";
                }
                else
                {
                    if(j==7)cout<<0;
                    else cout<<0<<" ";
                }
            }
            cout<<endl;
        }
        return;
    }
    for(int c=0;c<n;++c)
    {
        if(check(c,r))
        {
            col[r]=c;
            DFS(r+1);
        }
    }
}
int main()
{
    DFS(0);
    return 0;
}

1756:八皇后  

#include<iostream>
#include<cmath>
#include<string.h>
using namespace std;
int n=8,m,nn,tot;
int col[8]={0};
string s[93];
bool check(int c,int r)
{
    for(int i=0;i<r;++i)
    {
        if(col[i]==c||(abs(col[i]-c)==abs(i-r)))
        {
            return false;
        }
    }
    return true;
}
void DFS(int r)
{
    if(r==n)
    {
        for(int i=0;i<8;++i)s[tot]+=col[i]+1+'0';
        tot++;
//        cout<<tot<<":"<<s[tot]<<endl;
        return;
    }
    for(int c=0;c<n;++c)
    {
        if(check(c,r))
        {
            col[r]=c;
            DFS(r+1);
        }
    }
}
int main()
{
    cin>>nn;
    DFS(0);
    while(nn--)
    {
        cin>>m;
        cout<<s[m-1]<<endl;
    }
//     for(int i=0;i<8;++i)cout<<i<<","<<col[i]<<endl;
    return 0;
}

1789:算24

#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
double a[5];
int v[5];
int dfs(int t)
{
    if(t==4)
    {
        for(int i=1;i<5;++i)
        {
            if(v[i])continue;
            if(fabs(a[i]-24.0)<1e-7) return 1;
        }
    }
    for(int i=1;i<5;++i)
    {
        if(v[i])continue;
        for(int j=i+1;j<5;++j)
        {
            if(v[j]) continue;
            v[j]=1;
            double aa=a[i],b=a[j];
            a[i] = aa+b; if(dfs(t+1)) return 1;
            a[i] = aa-b; if(dfs(t+1)) return 1;
            a[i] = b-aa; if(dfs(t+1)) return 1;
            a[i] = aa*b; if(dfs(t+1)) return 1;
            a[i] = aa/b; if(dfs(t+1)) return 1;
            a[i] = b/aa; if(dfs(t+1)) return 1;
            a[i] = aa;
            v[j] = 0;
        }
    }
    return 0;
}
int main()
{
	while(cin>>a[1]>>a[2]>>a[3]>>a[4]&&(a[1]||a[2]||a[3]||a[4]))
	{
		memset(v,0,sizeof(v));
		if(dfs(1))cout<<"YES\n";
		else cout<<"NO\n";
	}
	return 0;
}

1792:迷宫

#include<iostream>
#include<cstring>
#include<cmath>
#include<queue>
#define MAX 102
using namespace std;
string m[MAX];
int v[MAX][MAX],n,flag;
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
struct node
{
    int x,y;
};
node s,e;
bool Check(node now)
{
    if(now.x<0||now.y<0||now.x>=n||now.y>=n)return false;
    else if(v[now.x][now.y]) return false;
    else if(m[now.x][now.y]=='#')return false;
    else return true;
}
void bfs(node ss)
{
    queue<node> Q;
    Q.push(ss);
    v[ss.x][ss.y]=1;
    while(!Q.empty())
    {
        node f = Q.front();Q.pop();
        if(f.x==e.x&&f.y==e.y){ flag=1; return ; }
        if(flag) return ;
        for(int i=0;i<4;++i)
        {
            node t;
            t.x=f.x+dir[i][0],t.y=f.y+dir[i][1];
            if(Check(t))
            {
                v[t.x][t.y]=1;
                Q.push(t);
            }
        }
    }
}
int main()
{
    int k;cin>>k;
	while(k--)
	{
		memset(v,0,sizeof(v));flag=0;
		cin>>n;
		for(int i=0;i<n;++i) cin>>m[i];
		cin>>s.x>>s.y>>e.x>>e.y;
		if(!Check(s)){ cout<<"NO\n"; continue; }
		bfs(s);
		if(flag)cout<<"YES\n";
		else cout<<"NO\n";
	}
	return 0;
}

1818:红与黑

#include<iostream>
#include<cstring>
#include<cmath>
#include<queue>
#define MAX 102
using namespace std;
string m[MAX];
int v[MAX][MAX],w,h,flag;
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
struct node
{
    int x,y,c;
};
node s,e;
bool Check(node now)
{
    if(now.x<0||now.y<0||now.x>=w||now.y>=h)return false;
    else if(v[now.x][now.y]) return false;
    else if(m[now.x][now.y]=='#')return false;
    else return true;
}
void bfs(node ss)
{
    queue<node> Q;
    Q.push(ss);
    v[ss.x][ss.y]=1;ss.c=1;
    while(!Q.empty())
    {
        node f = Q.front();Q.pop();
        for(int i=0;i<4;++i)
        {
            node t=f;
            t.x=f.x+dir[i][0],t.y=f.y+dir[i][1];
            if(Check(t))
            {
                v[t.x][t.y]=1;t.c++;
                Q.push(t);
            }
        }
    }
}
int main()
{
    while(cin>>h>>w&&(w||h))
    {
        memset(v,0,sizeof(v));flag=0;
        for(int i=0;i<w;++i)
        {
            cin>>m[i];
            for(int j=0;j<h;++j)
                if(m[i][j]=='@') { s.x=i,s.y=j;}
        }
        bfs(s);
        for(int i=0;i<w;++i)for(int j=0;j<h;++j) if(v[i][j]) flag++;
        cout<<flag<<"\n";
    }
	return 0;
}

2727:仙岛求药

#include<iostream>
#include<queue>
#include<string>
#include<cstring>
#define MAXX 10000
#define MAX 25
using namespace std;
int n,M,ans;
int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int v[MAX][MAX];
string m[MAX];
struct node
{
    int x,y,step;
};
node s,e,F;
bool Check(int x,int y)
{
    if(x<0||x>=M||y<0||y>=n) return false;
    else if(v[x][y]) return false;
    else if(m[x][y]=='#') return false;
    else return true;
}
void bfs(node S)
{
    queue<node> Q;
    Q.push(S);
    v[S.x][S.y]=1;
    while(!Q.empty())
    {
       F = Q.front();Q.pop();
//       if(F.x==e.x&&F.y==e.y) cout<<"现在的步数:"<<F.step<<endl;
       for(int i=0;i<4;++i)
       {
           node news=F;
           news.x = F.x+dir[i][0],news.y = F.y+dir[i][1];
           if(Check(news.x,news.y))
           {
               v[news.x][news.y]=1;news.step++;
               if(news.x==e.x&&news.y==e.y) {   ans = news.step;return;  }
               Q.push(news);
           }
       }
    }
}
int main()
{
    while(cin>>M>>n&&(M||n))
    {
        memset(v,0,sizeof(v));ans=0;
        for(int i=0;i<M;++i)
        {
            cin>>m[i];
            for(int j=0;j<n;++j)
            {
                if(m[i][j]=='@') s.x=i,s.y=j;
                if(m[i][j]=='*') e.x=i,e.y=j;
            }
        }
        bfs(s);
        if(ans) cout<<ans<<endl;
        else cout<<-1<<endl;
    }
    return 0;
}

2753:走迷宫

#include<iostream>
#include<queue>
#include<string>
#include<cstring>
#define MAXX 10000
#define MAX 45
using namespace std;
int R,C,ans;
int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int v[MAX][MAX];
string m[MAX];
struct node
{
    int x,y,step;
};
node s,e,F;
bool Check(int x,int y)
{
    if(x<0||x>=R||y<0||y>=C) return false;
    else if(v[x][y]) return false;
    else if(m[x][y]=='#') return false;
    else return true;
}
void bfs(node S)
{
    queue<node> Q;
    Q.push(S);
    v[S.x][S.y]=1;
    while(!Q.empty())
    {
       F = Q.front();Q.pop();
       for(int i=0;i<4;++i)
       {
           node news=F;
           news.x = F.x+dir[i][0],news.y = F.y+dir[i][1];
           if(Check(news.x,news.y))
           {
               v[news.x][news.y]=1;news.step++;
               if(news.x==e.x&&news.y==e.y) {   ans = news.step;return;  }
               Q.push(news);
           }
       }
    }
}
int main()
{
    cin>>R>>C;
    memset(v,0,sizeof(v));ans=0;
    for(int i=0;i<R;++i) cin>>m[i];
    s.x=0,s.y=0,e.x=R-1,e.y=C-1;
    bfs(s);
    cout<<ans+1<<endl;
    return 0;
}

2971:抓住那头牛

#include<iostream>
#include<string.h>
#include<queue> 
using namespace std;
int to[2]={1,-1};
int a,b,sum;
int vis[100000];
struct place
{
    int x,time;
};
int check(place k)
{
    if(k.x<0||k.x>100000||vis[k.x]==1)
        return 0;
    return 1;
}
int bfs(place n)
{
    place m,next;
    queue<place>w;
    w.push(n);
    while(!w.empty())
    {
        m=w.front();
        w.pop();
        if(m.x==b)
            return m.time;
        for(int i=0;i<2;i++)
        {
            next.x=m.x+to[i];
            next.time=m.time+1;
            if(next.x==b)
                return next.time;
            if(check(next))
            {
                w.push(next);
                vis[next.x]=1;
            }
        }
        next.x=m.x*2;
        next.time=m.time+1;
        if(next.x==b)
            return next.time;
        if(check(next))
        {
            w.push(next);
            vis[next.x]=1;
        }
    }
    return 0;
}
int main()
{
    int i,j,t;
    place x1;
    while(~scanf("%d %d",&a,&b))
    {
        x1.x=a;
        x1.time=0;
        vis[x1.x]=1;
        sum=0;
        sum=bfs(x1);
        printf("%d\n",sum);
    }
    return 0;
}

8465:马走日  

#include<iostream>
#include<queue>
#include<string>
#include<cstring>
#define MAXX 10000
#define MAX 45
using namespace std;
int n,T,m,ans;
int dir[8][2]={{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1}};
int v[MAX][MAX];
struct node
{
    int x,y,step;
};
node s,e,F;
bool Check(int x,int y)
{
    if(x<0||x>=n||y<0||y>=m) return false;
    else if(v[x][y]) return false;
    else return true;
}
void dfs(node S)
{
   if(S.step==n*m){ ans++; return;}
   for(int i=0;i<8;++i)
   {
       node news=S;
       news.x = S.x+dir[i][0],news.y = S.y+dir[i][1];
       if(Check(news.x,news.y))
       {
           v[news.x][news.y]=1;
           news.step++;
           dfs(news);
           v[news.x][news.y]=0;
           news.step--;
       }
   }
}
int main()
{
    cin>>T;
    while(T--)
    {
        cin>>n>>m>>s.x>>s.y;ans=0;
        memset(v,0,sizeof(v));
        v[s.x][s.y]=1;s.step=1;
        dfs(s);
        cout<<ans<<endl;
    }
    return 0;
}

6264:走出迷宫

#include<iostream>
#include<queue>
#include<string>
#include<cstring>
#define MAXX 10000
#define MAX 205
using namespace std;
int M,N,T,ans=0;
int dir[4][2]={{0,1},{-1,0},{0,-1},{1,0}};
int v[MAX][MAX];
string m[MAX];
struct node
{
    int x,y,step,t;
};
node s,e;
bool Check(node ne)
{
    if(ne.x<0||ne.x>=N||ne.y<0||ne.y>=M) return false;
    else if(v[ne.x][ne.y]) return false;
    else if(m[ne.x][ne.y]=='#') return false;
    else return true;
}
void bfs(node S)
{
   S.t=T;queue<node>Q;
   Q.push(S);v[S.x][S.y]=T;
   while(!Q.empty())
   {
     node F = Q.front();Q.pop();
     if(F.x==e.x&&F.y==e.y) { ans=F.step; return; }
     for(int i=0;i<4;++i)
     {
         node ne=F;
         ne.x=F.x+dir[i][0],ne.y=F.y+dir[i][1];
         if(!Check(ne)) continue;
         v[ne.x][ne.y]=1;
         ne.step++;
         Q.push(ne);
     }
   }
}
int main()
{
    cin>>N>>M;
    for(int i=0;i<N;++i)
    {
        cin>>m[i];
        for(int j=0;j<M;++j)
        {
            if(m[i][j]=='S') s.x=i,s.y=j;
            if(m[i][j]=='T') e.x=i,e.y=j;
        }
    }
    bfs(s);
    cout<<ans<<endl;
    return 0;
}

6266取石子游戏[博弈论]

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
int t;
bool dfs(int a,int b)//先手
{
    if((a%b==0)||(a/b>=2)) return true; 
    else if(a/b==1)  return !dfs(max(b,a-b),min(b,a-b));//后手
    else return false;
}
int main()
{
    int a,b;
    while(~scanf("%d%d",&a,&b)&&(a||b))
    {
        if(dfs(max(a,b),min(a,b))) printf("win\n");
        else printf("lose\n");
    }
    return 0;
}

666:放苹果[排列组合]

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
int dfs(int m,int n)
{
    if(m==1 || n==1) return 1;
	else if(m<n) return dfs(m,m);
	else if(m==n) return dfs(m,m-1)+1;
    else if(m>n) return dfs(m-n,n)+dfs(m,n-1);
}
int main()
{
    int a,b,t;scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&a,&b);
        cout<<dfs(a,b)<<endl;
    }
    return 0;
}

7084:迷宫问题[优先队列]

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<queue>
#include<cstring>
#include<sstream>
#define MAX 100
#include<algorithm>
using namespace std;
int dir[4][2]={{0,1},{0,-1},{-1,0},{1,0}};
struct point
{
    int x,y;
};
struct node
{
    int x,y,k;
    point step[MAX];
    bool operator < (const node&a)const{ return k>a.k; }
};
int m[MAX][MAX];
bool v[MAX][MAX];
bool Check(node s)
{
    if(s.x<0||s.y<0||s.x>=5||s.y>=5) return true;
    else if(v[s.x][s.y]) return true;
    else if(m[s.x][s.y]) return true;
    else return false;
}
void Print(node f)
{
    for(int i=0;i<=f.k;++i)
        cout<<"("<<f.step[i].x<<", "<<f.step[i].y<<")"<<endl;
}
void bfs(node s)
{
    priority_queue<node>Q;
    v[s.x][s.y]=1;s.k=0;s.step[0].x=0,s.step[0].y=0;
    Q.push(s);
    while(!Q.empty())
    {
        node f=Q.top();Q.pop();
        if(f.x==4&&f.y==4) { Print(f);return;}
        for(int i=0;i<4;++i)
        {
            node ne=f;
            ne.x=f.x+dir[i][0],ne.y=f.y+dir[i][1];
            if(Check(ne)) continue;
            v[ne.x][ne.y]=1;
            ne.k=f.k+1;
            ne.step[ne.k].x=ne.x,ne.step[ne.k].y=ne.y;
            Q.push(ne);
        }
    }
}
int main()
{
    for(int i=0;i<5;++i)
        for(int j=0;j<5;++j)
            cin>>m[i][j];
    node s;
    s.x=0,s.y=0;
    bfs(s);
    return 0;
}

7218:献给阿尔吉侬的花束[优先队列]

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<queue>
#include<cstring>
#include<sstream>
#define MAX 205
#include<algorithm>
using namespace std;
int dir[4][2]={{0,1},{0,-1},{-1,0},{1,0}};
struct node
{
    int x,y,k;
    bool operator < (const node&a)const{ return k>a.k; }
};
int R,C,ans;
node S,E;
string m[MAX];
bool v[MAX][MAX];
bool Check(node s)
{
    if(s.x<0||s.y<0||s.x>=R||s.y>=C) return true;
    else if(v[s.x][s.y]) return true;
    else if(m[s.x][s.y]=='#') return true;
    else return false;
}
void bfs(node s)
{
    priority_queue<node>Q;
    v[s.x][s.y]=1;
    Q.push(s);
    while(!Q.empty())
    {
        node f=Q.top();Q.pop();
//        cout<<"\t\t>>"<<f.x<<","<<f.y<<endl;
        if(f.x==E.x&&f.y==E.y) { ans = f.k;return;}
        for(int i=0;i<4;++i)
        {
            node ne=f;
            ne.x=f.x+dir[i][0],ne.y=f.y+dir[i][1];
            if(Check(ne)) continue;
            v[ne.x][ne.y]=1;
            ne.k=f.k+1;
//            cout<<ne.x<<","<<ne.y<<endl;
            Q.push(ne);
        }
    }
}
int main()
{
    int t;scanf("%d",&t);
    while(t--)
    {
        cin>>R>>C;
        memset(v,0,sizeof(v));ans=0;
        for(int i =0;i<R;++i)
        {
            cin>>m[i];
            for(int j=0;j<C;++j)
            {
                if(m[i][j]=='S') S.x=i,S.y=j;
                if(m[i][j]=='E') E.x=i,E.y=j;
            }
        }
        bfs(S);
        if(ans==0) cout<<"oop!"<<endl;
        else  cout<<ans<<endl;
    }
    return 0;
} 

4980:拯救行动

#include<iostream>
#include<queue>
#include<string>
#include<cstring>
#define MAXX 10000
#define MAX 220
using namespace std;
int M,N,T,ans=0;
int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int v[MAX][MAX];
string m[MAX];
struct node
{
    int x,y,step;
    bool operator < (const node&a)const{return step>a.step;}
};
node s,e;
bool Check(node ne)
{
    if(ne.x<0||ne.x>=N||ne.y<0||ne.y>=M) return false;
    else if(m[ne.x][ne.y]=='#') return false;
    else return true;
}
void bfs(node S)
{
   priority_queue<node>Q;
   Q.push(S);m[S.x][S.y]='#';
   while(!Q.empty())
   {
     node F = Q.top();Q.pop();
     for(int i=0;i<4;++i)
     {
         node ne=F;
         ne.x=F.x+dir[i][0],ne.y=F.y+dir[i][1];
         if(!Check(ne)) continue;
         ne.step++;
         if(m[ne.x][ne.y]=='@')  Q.push(ne);
         if(m[ne.x][ne.y]=='x') { ne.step++;Q.push(ne);}
         if(m[ne.x][ne.y]=='a') { ans=ne.step; return; }
         m[ne.x][ne.y]='#';
     }
   }
}
int main()
{
    int SS;cin>>SS;
    while(SS--)
    {
        memset(v,0,sizeof(v));ans=0;
        cin>>N>>M;
        for(int i=0;i<N;++i)
        {
            cin>>m[i];
            for(int j=0;j<M;++j)
            {
                if(m[i][j]=='r') s.x=i,s.y=j;
                if(m[i][j]=='a') e.x=i,e.y=j;
            }
        }
        bfs(s);
        if(ans) cout<<ans<<endl;
        else cout<<"Impossible"<<endl;
    }
    return 0;
}

6044:鸣人和佐助 

#include<iostream>
#include<queue>
#include<string>
#include<cstring>
#define MAXX 10000
#define MAX 205
using namespace std;
int M,N,T,ans=-1;
int dir[4][2]={{0,1},{-1,0},{0,-1},{1,0}};
int v[MAX][MAX];
string m[MAX];
struct node
{
    int x,y,step,t;
};
node s,e;
bool Check(node ne)
{
    if(ne.x<0||ne.x>=M||ne.y<0||ne.y>=N) return false;
    else if(ne.t<=v[ne.x][ne.y]) return false;
    else return true;
}
void bfs(node S)
{
   S.t=T;queue<node>Q;
   Q.push(S);v[S.x][S.y]=T;
   while(!Q.empty())
   {
     node F = Q.front();Q.pop();
     if(F.x==e.x&&F.y==e.y) { ans=F.step; return; }
     for(int i=0;i<4;++i)
     {
         node ne=F;
         ne.x=F.x+dir[i][0],ne.y=F.y+dir[i][1];
         if(!Check(ne)) continue;
         if(m[ne.x][ne.y]=='#'&&ne.t>0)
         {
             ne.t--;ne.step++;
             v[ne.x][ne.y]=ne.t;
             Q.push(ne);
         }
         else if(m[ne.x][ne.y]=='*'||m[ne.x][ne.y]=='+')
         {
            v[ne.x][ne.y]=ne.t;
            ne.step++;
            Q.push(ne);
         }

     }
   }
}
int main()
{
    cin>>M>>N>>T;
    memset(v,-1,sizeof(v));
    for(int i=0;i<M;++i)
    {
        cin>>m[i];
        for(int j=0;j<N;++j)
        {
            if(m[i][j]=='@') s.x=i,s.y=j;
            if(m[i][j]=='+') e.x=i,e.y=j;
        }
    }
    bfs(s);
    cout<<ans<<endl;
    return 0;
}

7834:分成互质组[dfs+涂色]🚩

323:棋盘问题[跟八皇后类似]🚩

#include<iostream>
#include<string>
#include<cstring>
#include<stdio.h>
#define MAX 100
using namespace std;
int n,k,ans;
string m[MAX];
int v[MAX];
void dfs(int r,int cs)//第r行,第cs个棋子
{
    if(n-r<k-cs) return;
    dfs(r+1,cs);//这一行放不棋子
    for(int c=0;c<n;++c)//这一行放棋子
    {
        //如果是棋盘区并且没有放过棋子
        if(m[r][c]=='#'&&!v[c])
        {
            if(cs==k)
            { 
                ++ans;
            }
            else
            {
                v[c]=1;
                dfs(r+1,cs+1);
                v[c]=0;
            }
        }
    }
}
int main()
{
    while(~scanf("%d%d",&n,&k))
    {
        if(n==-1&&k==-1)break;
        for(int i=0;i<n;++i)cin>>m[i];
        memset(v,0,sizeof(v));ans=0;
        dfs(0,1);
        cout<<ans<<endl;
    }

    return 0;
}

8783:单词接龙🚩  

#include<cstdio>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
string a[21];
int n,maxn,used[21],l=1;
void dfs(int c)//a[c]已定单词,a[i]接龙单词
{
    int lc,li;
    maxn=max(maxn,l);
    for(int i=1;i<=n;i++)//遍历一下单词表
        if(used[i]<2)
            for(int j=0;j<a[c].length();j++)//将已定单词的每一个字母逐一与接龙单词
                if(a[c][j]==a[i][0])//的首字母比较,从相同的地方开始接
                {
                    lc=j;
                    li=0;//记录接龙起点
                    while(a[c][lc]==a[i][li]&&lc<a[c].length())//逐个比对,如果相同且长度没超过已定单词的长度就累加长度
                    {
                        lc++;
                        li++;
                    }
                    if(lc==a[c].length())//如果比对到了,就接上长度(到达目标)
                    {
                        l+=a[i].length()-li;
                        used[i]++;
                        dfs(i);
                        l-=a[i].length()-li;
                        used[i]--;
                    }
                }
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        cin>>a[i];
    cin>>a[n+1];
    l=a[n+1].length();
    dfs(n+1);//把头字母也当成一个单词,从头字母开始搜
    printf("%d",maxn);
}

917:Knight Moves

#include<iostream>
#include<queue>
#include<string>
#include<cstring>
#define MAX 330
using namespace std;
int n,T,m,ans;
int dir[8][2]={{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1}};
struct node
{
    int x,y,step;

    bool operator < (const node&a) const{ return step>a.step;}
};
int v[MAX][MAX];
node s,e;
bool Check(node t)
{
    if(t.x<0||t.x>=n||t.y<0||t.y>=n) return false;
    else if(v[t.x][t.y]) return false;
    else return true;
}
void bfs(node S)
{
    priority_queue<node>Q;
    v[S.x][S.y]=1;
    Q.push(S);
    while(!Q.empty())
    {
        node f=Q.top();Q.pop();
        if(f.x==e.x&&f.y==e.y) { ans=f.step;return; }
        for(int i=0;i<8;++i)
        {
           node news=f;
           news.x = f.x+dir[i][0],news.y = f.y+dir[i][1];
           if(Check(news))
           {
               v[news.x][news.y]=1;
               news.step=f.step+1;
               Q.push(news);
           }
        }
    }
}
int main()
{
    cin>>T;
    while(T--)
    {
        cin>>n>>s.x>>s.y>>e.x>>e.y;ans=0;
        memset(v,0,sizeof(v));
        if(s.x==e.x&&s.y==e.y)
        {
            cout<<0<<endl;
        }
        else
        {
            bfs(s);
            cout<<ans<<endl;
        }

    }
    return 0;
}

2152:Pots

 

posted @ 2020-02-08 11:05  东坡肉肉君  阅读(546)  评论(0编辑  收藏  举报