从零单排12

杭电OJ上看到一个搜索专练,听说Unix考试延期了。。今天上午就做了这上面的搜索题目。。

七题,总的来说就是bfs掌握的不错。。。(dfs第五题就不贴题解了。。。题解都看不懂,。。吃透dfs再做)

dfs还需要加把劲。。

都是水题。。


/*
忘写check函数wa一次
check函数n,m对应关系搞混wa一次。。
*/
#include<iostream>
#include<queue>
using namespace std;
struct node
{
	int x;
	int y;
	int step;
};
node s;
node next;
queue<node>q;
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
char map[25][25];
int visit[25][25];
int n,m;
int sx,sy;
int sum;
void getmap()
{
	for(int i=0;i<m;i++)
	{
		cin>>map[i];
		for(int j=0;j<n;j++)
		{
			if(map[i][j]=='@')
			{
				sx=i;
				sy=j;
				break;
			}
		}
	}
}
int check(int x,int y)
{
	if(x>=0&&x<m&&y>=0&&y<n)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
void bfs()
{
	sum=1;
	memset(visit,0,sizeof(visit));
	while(!q.empty())
	{
		q.pop();
	}
	s.x=sx;
	s.y=sy;
	s.step=0;
	visit[s.x][s.y]=1;
	q.push(s);
	while(!q.empty())
	{
		s=q.front();
		q.pop();
		for(int i=0;i<4;i++)
		{
			next.x=s.x+dx[i];
			next.y=s.y+dy[i];
			next.step=s.step+1;
			if(map[next.x][next.y]=='.'&&!visit[next.x][next.y]&&check(next.x,next.y))
			{
				sum++;
				q.push(next);
				visit[next.x][next.y]=1;
			}
		}
	}
}
	
int main()
{
	while(cin>>n>>m,n!=0&&m!=0)
	{
		getmap();
		bfs();
		cout<<sum<<endl;
	}
	system("pause");
	return 0;
}

/*
注意DFS的精髓visit[][]的变化 
1A
*/ 
#include<iostream>
using namespace std;
char map[105][105];
int visit[105][105];
int n,m;
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
void getmap()
{
	for(int i=0;i<n;i++)
	{
		cin>>map[i];
	}
}
int check(int x,int y)
{
	if(x>=0&&x<n&&y>=0&&y<m)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
void dfs(int x,int y)
{
	for(int i=0;i<4;i++)
	{
		int nextx=x+dx[i];
		int nexty=y+dy[i];
		if(!visit[nextx][nexty]&&check(nextx,nexty)&&map[nextx][nexty]=='#')
		{
			visit[nextx][nexty]=1;
			dfs(nextx,nexty);
		}
	}
}
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		cin>>n>>m;
		memset(visit,0,sizeof(visit));
		getmap();
		int ans=0;
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<m;j++)
			{
				if(map[i][j]=='#'&&!visit[i][j])
				{
					visit[i][j]=1;
					dfs(i,j);
					ans++;
				}
			}
		}
		cout<<ans<<endl;
	}
	system("pause");
	return 0;
}

/*
dfs+剪枝
对这种深搜题目木有什么思路
题解学习一下。。
*/
#include<iostream>
#include<algorithm>
using namespace std;
int a[25];
int visit[25];
int sum,aver,maxa,n,flag;
void dfs(int edge,int cnt,int k)
{
	if(edge==aver)
	{
		cnt++;
		if(cnt==4)
		{
			flag=1;
			return ;
		}
		else
		{
			edge=0;
			k=0;
		}
	}
	if(flag)
		return ;
	for(int i=k;i<n;i++)
	{
		if(!visit[i]&&edge+a[i]<=aver)
		{
			visit[i]=1;
			dfs(edge+a[i],cnt,i);
			visit[i]=0;
		}
	}
}
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		sum=maxa=0;
		cin>>n;
		memset(visit,0,sizeof(visit));
		for(int i=0;i<n;i++)
		{
			cin>>a[i];
			maxa=max(a[i],maxa);
			sum+=a[i];
		}
		if(sum%4!=0||maxa>sum/4)
		{
			cout<<"no"<<endl;
		}
		else
		{
			flag=0;
			aver=sum/4;
			dfs(0,0,0);
			if(flag)
			{
				cout<<"yes"<<endl;
			}
			else
			{
				cout<<"no"<<endl;
			}
		}
	}
	system("pause");
	return 0;
}

/*
还是最不擅长的dfs
注意标记变量保证不重复
参考题解代码,dfs有一点思路了已经
 
*/
#include<iostream>
using namespace std;
int t,n,flag;
int num[14],save[14];
 
bool cmp(const int &a,const int &b)
{
	return a>b;
}
 
void dfs(int i,int sum,int count)
{
    if(sum>t)
        return ;
    if(sum==t)
	{
        for(int j=0;j<count-1;j++)
		{
        	cout<<save[j]<<"+";
        }
    	cout<<save[count-1]<<endl;
        flag=1;
        return;
    }
    int tag=-1;
    for(int k=i;k<n;k++)
	{
        if(num[k]!=tag)
		{
            save[count]=num[k];
            sum+=num[k]; //每次的和
            tag=num[k];  //保留当前的数,能避免重复
            dfs(k+1,sum,count+1);
            sum-=num[k];
        }
    }
}
int main()
{
    while(cin>>t>>n&&n!=0)
	{
    	for(int i=0;i<n;i++)
		{
            cin>>num[i];
        }
        sort(num,num+n,cmp);
    	cout<<"Sums of "<<t<<":"<<endl;
        dfs(0,0,0);
        if(!flag)
		{
            cout<<"NONE"<<endl;
        }
        flag=0;
    }
    return 0;
}

/*
这题wa了一万次。。
visit[]数组开小了。。。。。。。
我把代码改的不成样子了都。。。。
*/
#include<iostream>
#include<queue>
using namespace std;
struct node
{
	int x;
	int step;
};
int visit[200005];
int start,end;
int check(int x)
{
	if(x>=0&&x<=100000)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
void bfs()
{
	queue<node>q;
	node s;
	node next;
	s.x=start;
	s.step=0;
	q.push(s);
	visit[s.x]=1;
	while(!q.empty())
	{
		s=q.front();
		q.pop();
		if(s.x==end)
		{
			printf("%d\n",s.step);
			return ;
		}	
		if(!visit[s.x*2]&&check(s.x*2))
		{
			next.x=s.x+s.x;
			next.step=s.step+1;
			visit[next.x]=1;
			q.push(next);
		}
		if(!visit[s.x-1]&&check(s.x-1))
		{
			next.x=s.x-1;
			next.step=s.step+1;
			visit[next.x]=1;
			q.push(next);
		}
		if(!visit[s.x+1]&&check(s.x+1))
		{
			next.x=s.x+1;
			next.step=s.step+1;
			visit[next.x]=1;
			q.push(next);
		}	
	}
}
				
			
			
int main()
{
	while(scanf("%d%d",&start,&end)!=EOF)
	{
		if(end<start)
		{
			cout<<start-end<<endl;
		}
		else
		{
			memset(visit,0,sizeof(visit));
			bfs();
		}
	}
	system("pause");
	return 0;
}
		

/*
木有什么难度。。
visit[][]标记是否走过,当遇到visit[][]=1时说明进入循环
另外开一个record[][]数组标记每个状态的步数
*/
#include<iostream>
#include<cstdio>
using namespace std;
char map[15][15];
int visit[15][15];
int record[15][15];
int n,m,k,cnt;
void dfs(int x,int y)
{
	if(x<0||x>=n||y<0||y>=m||visit[x][y]==1)
	{
		if(visit[x][y]==1)
		{
			printf("%d step(s) before a loop of %d step(s)\n",record[x][y]-1,cnt-record[x][y]+1);
		}
		else
		{
			printf("%d step(s) to exit\n",cnt);
		}
		return ;	
	}	
	visit[x][y]=1;
	cnt++;
	record[x][y]=cnt;
	if(map[x][y]=='E')
	{
		dfs(x,y+1);
	}
	if(map[x][y]=='W')
	{
		dfs(x,y-1);
	}
	if(map[x][y]=='N')
	{
		dfs(x-1,y);
	}
	if(map[x][y]=='S')
	{
		dfs(x+1,y);
	}
}
int main()
{
	while(cin>>n>>m>>k&&n+m+k!=0)
	{
		cnt=0;
		for(int i=0;i<n;i++)
		{
			cin>>map[i];
		}
		memset(visit,0,sizeof(visit));
		memset(record,0,sizeof(record));
		dfs(0,k-1);
	}
	system("pause");
	return 0;
}

下午博雅课。。好困。。

还要看物理实验。。

又A了几题。。搜索就做到现在吧。。。

虽然一遇到搜索总是先写bfs...dfs几乎不会。。。

/*
题没什么好说的就是dfs+枚举。。
嫌太麻烦了抄了代码。。。
我有罪
*/
#include<iostream>
#include<cstring>
using namespace std;
int a[10],b[10];
int mark[10];
int flag;
int judge(int num,int n)
{
	if(n==1&&num==2)
		return 1;
	if(n==8&&num==7)
		return 1;

	if((n>1&&n<8)&&(num==(n-1)||num==(n+1)))
			return 1;
		
		return 0;
}
int check(int pos ,int n)
{
	int i;
	if(pos==1)
	{
		for(i=2;i<=4;i++)
			if(judge(a[i],n))	return 0;
			return 1;
	}
	if(pos==2)
	{
		if(judge(a[1],n))     return 0;
		if(judge(a[3],n))     return 0;
		if(judge(a[5],n))     return 0;
		if(judge(a[6],n))     return 0;
		return 1;
	}
	
	if(pos==3)
	{
		if(judge(a[1],n))     return 0;
		if(judge(a[2],n))     return 0;
		for(i=4;i<=7;i++)
			if(judge(a[i],n))	return 0;
			return 1;
	}
	
	if(pos==4)
	{
		if(judge(a[1],n))     return 0;
		if(judge(a[3],n))     return 0;
		for(i=6;i<=7;i++)
			if(judge(a[i],n))	return 0;
			return 1;
	}
	
	if(pos==5)
	{
		if(judge(a[2],n))     return 0;
		if(judge(a[3],n))     return 0;
		
		if(judge(a[6],n))     return 0;
		if(judge(a[8],n))     return 0;
		return 1;
	}
	if(pos==6)
	{
		for(i=2;i<=5;i++)
			if(judge(a[i],n))	return 0;
			return 1;
			for(i=7;i<=8;i++)
				if(judge(a[i],n))	return 0;
				return 1;
	}
	if(pos==7)
	{
		if(judge(a[3],n))     return 0;
		if(judge(a[4],n))     return 0;
		if(judge(a[6],n))     return 0;
		if(judge(a[8],n))	return 0;
		return 1;
	}
	
	if(pos==8)
	{
		for(i=5;i<=6;i++)
			if(judge(a[i],n))	return 0;
			return 1;
	}
	
}
void DFS(int pos)
{
	int i;
	if(pos>8)
	{
		flag++;		
		for(i=1;i<=8;i++)
			b[i]=a[i];
		return ;
	}
	if(a[pos]==0)
	{
		for( i=1;i<=8;i++)
		{
			if(!mark[i]&&check(pos,i))
			{
				mark[i]=1;
				a[pos]=i;
				DFS(pos+1);
				mark[i]=0;
				a[pos]=0;
			}
		}
	}
	else
		DFS(pos+1);
}
int main()
{
	int t,i,j;
	cin>>t;
	
	for(j=1;j<=t;j++)
	{
		memset(mark,0,sizeof(mark));
		for(i=1;i<=8;i++)
		{
			cin>>a[i];
			mark[a[i]]=1;
		}
		flag=0;
		
		DFS(1);
		
		if(!flag)
		{
			printf("Case %d: ",j);
			printf("No answer\n");
		}
		else if(flag>1)
		{
			printf("Case %d: ",j);
			printf("Not unique\n");
		}
		else
		{
			printf("Case %d: ",j);
			printf("%d",b[1]);
			for(i=2;i<=8;i++)
				printf(" %d",b[i]);
			printf("\n");
		}
	}
	return 0;
	
}

/*
c++过了
GNC C++没有过。。
简单的bfs..
*/
#include<iostream>
#include<queue>
#include<cstdio>
using namespace std;
struct node
{
	int x;
	int y;
	int z;
	int step;
};
node s;
node next;
queue<node>q;
int dx[6]={1,0,-1,0,0,0};
int dy[6]={0,-1,0,1,0,0};
int dz[6]={0,0,0,0,1,-1};
int map[50][50][50];
int visit[50][50][50];
int sx,sy,sz,ex,ey,ez;
int A,B,C,T;
int check(int x,int y,int z)
{
	if(x>=0&&x<A&&y>=0&&y<B&&z>=0&&z<C&&map[x][y][z]==0)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
void bfs()
{
	for(int i=0;i<A;i++)
	{
		for(int j=0;j<B;j++)
		{
			for(int l=0;l<C;l++)
			{
				visit[i][j][l]=0;
			}
		}
	}
	s.x=sx;
	s.y=sy;
	s.z=sz;
	s.step=0;
	q.push(s);
	visit[s.x][s.y][s.z]=1;
	while(!q.empty())
	{
		s=q.front();
		q.pop();
		if(s.x==ex&&s.y==ey&&s.z==ez)
		{
			if(s.step<=T)
				printf("%d\n",s.step);
			else
				printf("-1\n");
			return ;
		}
		for(int i=0;i<6;i++)
		{
			next.x=s.x+dx[i];
			next.y=s.y+dy[i];
			next.z=s.z+dz[i];
			next.step=s.step+1;
			if(check(next.x,next.y,next.z)&&!visit[next.x][next.y][next.z])
			{
				q.push(next);
				visit[next.x][next.y][next.z]=1;
			}
		}
	}
	printf("-1\n");
}
int main()
{
	int k;
	scanf("%d",&k);
	while(k--)
	{
//		memset(map,1,sizeof(map));
		scanf("%d%d%d%d",&A,&B,&C,&T);
		for(int i=0;i<A;i++)
		{
			for(int j=0;j<B;j++)
			{
				for(int l=0;l<C;l++)
				{
					scanf("%d",&map[i][j][l]);
				}
			}
		}
		sx=0;
		sy=0;
		sz=0;
		ex=A-1;
		ey=B-1;
		ez=C-1;
		bfs();
	}
	system("pause");
	return 0;
}

/*
额。
bfs模版敲的越来越熟练了。。
*/
#include<iostream>
#include<queue>
using namespace std;
struct node
{
	int x;
	int y;
	int step;
};
node s;
node next;
queue<node>q;
int dx[8]={2,1,-1,-2,-2,-1,1,2};
int dy[8]={1,2,2,1,-1,-2,-2,-1};
int map[9][9];
int visit[9][9];
int sx,sy,ex,ey;
char s1[5],s2[5];
int check(int x,int y)
{
	if(x>=0&&x<8&&y>=0&&y<8)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
void bfs()
{
	memset(visit,0,sizeof(visit));
	while(!q.empty())
	{
		q.pop();
	}
	s.x=sx;
	s.y=sy;
	s.step=0;
	q.push(s);
	visit[s.x][s.y]=1;
	while(!q.empty())
	{
		s=q.front();
		q.pop();
		if(s.x==ex&&s.y==ey)
		{
			cout<<"To get from "<<s1<<" to "<<s2<<" takes "<<s.step<<" knight moves."<<endl;
			return ;
		}
		for(int i=0;i<8;i++)
		{
			next.x=s.x+dx[i];
			next.y=s.y+dy[i];
			next.step=s.step+1;
			if(!visit[next.x][next.y]&&check(next.x,next.y))
			{
				q.push(next);
				visit[next.x][next.y]=1;
			}
		}
	}
}
int main()
{
	while(cin>>s1>>s2)
	{
		sx=s1[0]-'a';
		sy=s1[1]-'1';
		ex=s2[0]-'a';
		ey=s2[1]-'1';
		bfs();
	}
	system("pause");
	return 0;
}

/*
还是bfs
只不过状态之间的转换变了
网上搜的代码
*/
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
struct node
{
    int bucket[3];
    int step;
};
bool matrix[101][101][101];
int bfs(int a,int b,int c)
{
    int half,st[3],i,j;;
    node cur,temp;
    memset(matrix,0,sizeof(matrix));
    queue<node>que;
    st[0]=a,st[1]=b,st[2]=c;
    half=a>>1;
    cur.bucket[0]=st[0],cur.bucket[1]=0,cur.bucket[2]=0,cur.step=0;
    matrix[a][0][0]=1;
    que.push(cur);
    while(!que.empty())
    {
        cur=que.front(),que.pop();
        if((cur.bucket[0]==half&&cur.bucket[1]==half)||(cur.bucket[1]==half&&cur.bucket[2]==half)||(cur.bucket[2]==half&&cur.bucket[0]==half))
        {
            return cur.step;
        }
        cur.step++;
        for(i=0; i<3; i++)
        {
            if(cur.bucket[i]>0)
                for(j=0; j<3; j++)
                {
                    temp=cur;
                    if(i==j)continue;
                    if(temp.bucket[i]<=st[j]-temp.bucket[j])
                    {
                        temp.bucket[j]+=temp.bucket[i];
                        temp.bucket[i]=0;
                    }
                    else
                    {
                        temp.bucket[i]-=st[j]-temp.bucket[j];
                        temp.bucket[j]=st[j];
                    }
                    if(!matrix[temp.bucket[0]][temp.bucket[1]][temp.bucket[2]])
                    {
                        matrix[temp.bucket[0]][temp.bucket[1]][temp.bucket[2]]=1;
                        que.push(temp);
                    }
                }
        }
    }
    return 0;
}
int main()
{
    int a,b,c,ans;
    while(cin>>a>>b>>c,a||b||c)
    {

        if(a%2)
        {
            cout<<"NO"<<endl;
            continue;
        }
        ans=bfs(a,b,c);
        if(ans==0)cout<<"NO"<<endl;
        else cout<<ans<<endl;
    }
    return 0;
}

/*
简单dfs
用isprime[]数组事先标记是否为素数
*/
#include<iostream>
using namespace std;
int n,ans[21],isprime[]={0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0},visit[21];
void dfs(int step)
{
    int i;
    if(step==n+1)
    {
        if(isprime[ans[n]+1])
        {
            for(i=1;i<=n-1;i++)
            {
				cout<<ans[i]<<" ";
			}
			cout<<ans[i]<<endl;
		}
	}
    else
    {
        for(i=2;i<=n;i++)
        {
            if(!visit[i]&&isprime[i+ans[step-1]])
            {
                ans[step]=i;
                visit[i]=1;
                dfs(step+1);
                visit[i]=0;
            }
		}
	}
}
int main()
{
    int tt;
    tt=0;
    while(cin>>n)
    {
        tt++;
        ans[1]=1;
        memset(visit,0,sizeof(visit));
        cout<<"Case "<<tt<<":"<<endl;
        dfs(2);
        cout<<endl;
    }
} 

/*
变形bfs
用map[i][j]表示i+'a'开头j+'a'结尾的单词
然后就是bfs模版了
*/
#include <iostream>
#include <queue>
using namespace std;
int visit[10005];
int map[55][55];
char str[10005];
queue<int>q;
int s;
int next;
void bfs()
{
	memset(visit,0,sizeof(visit));
	while(!q.empty())
	{
		q.pop();
	}
    s='b'-'a';
    q.push(s);
    visit[s]=1;
    while(!q.empty())
    {
        s=q.front();
        q.pop(); 
		if(s=='m'-'a')
        {
        	cout<<"Yes."<<endl;
            return;
        }         
        for(int i=0;i<26;i++)
        {
			next=i;
            if(!visit[next]&&map[s][next]==1)
            {  
                q.push(next);
                visit[next]=1;
            }
        }
    }
    cout<<"No."<<endl;
}

int main()
{
    memset(map,0, sizeof(map));
    while(cin>>str)
    {
        int l=strlen(str);
        map[str[0]-'a'][str[l-1]-'a']=1;
        if(str[0]=='0')
        {    
            bfs();
            memset(map,0,sizeof(map));
        }
    }
    return 0;
}

/*
三维bfs
*/
#include<iostream>
#include<queue>
using namespace std;
struct node
{
	int x;
	int y;
	int z;
	int step;
};
node s;
node next;
queue<node>q;
int dx[6]={1,0,-1,0,0,0};
int dy[6]={0,1,0,-1,0,0};
int dz[6]={0,0,0,0,1,-1};
char map[11][11][11];
int n;
int sx,sy,sz,ex,ey,ez;
int visit[11][11][11];
int check(int x,int y,int z)
{
	if(x>=0&&x<n&&y>=0&&y<n&&z>=0&&z<n)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
void bfs()
{
	memset(visit,0,sizeof(visit));
	while(!q.empty())
	{
		q.pop();
	}
	s.x=sx;
	s.y=sy;
	s.z=sz;
	s.step=0;
	visit[s.x][s.y][s.z]=1;
	q.push(s);
	while(!q.empty())
	{
		s=q.front();
		q.pop();
		if(s.x==ex&&s.y==ey&&s.z==ez)
		{
			printf("%d %d\n",n,s.step);
			return ;
		}
		for(int i=0;i<6;i++)
		{
			next.x=s.x+dx[i];
			next.y=s.y+dy[i];
			next.z=s.z+dz[i];
			next.step=s.step+1;
			if(!visit[next.x][next.y][next.z]&&check(next.x,next.y,next.z)&&map[next.x][next.y][next.z]=='O')
			{
				visit[next.x][next.y][next.z]=1;
				q.push(next);
			}
		}
	}
	printf("NO ROUTE\n");
}

	
int main()
{
	char s1[10],s2[10];
	char temp[10];
	while(scanf("%s%s",s1,s2)!=EOF)
	{
		n=s2[0]-'0';
		for(int k=0;k<n;k++)
		{
			for(int i=0;i<n;i++)
			{
				getchar();
				for(int j=0;j<n;j++)
				{
					scanf("%c",&map[i][j][k]);
				}
			}
		}
		scanf("%d%d%d",&sx,&sy,&sz);
		scanf("%d%d%d",&ex,&ey,&ez);
		scanf("%s",temp);
		bfs();
	}
	system("pause");
	return 0;
}
		

/*
二维背包。。还没学到。。以后再说
用dfs写超时。。
*/
#include<iostream>
#define N 25
using namespace std;
int v[N],w[N],visit[N];
int n,m;
int W;
int sum;
void dfs(int value,int weight,int num,int index)
{
    if(num==m||value==n)
    {
		if(sum<weight)
		{
			sum=weight;
		}
		return ;
	}
	for(int i=index;i<n;i++)
	{
		if(!visit[i]&&num+1<=m&&weight+w[i]<=W)
		{
			visit[i]=1;
			dfs(value+v[i],weight+w[i],num+1,index+1);
			visit[i]=0;
		}
	}
	return ;
}
int main()
{
	int T;
    scanf("%d",&T);   
	while(T--)
    {
		memset(v,0,sizeof(v));
        memset(w,0,sizeof(w));
        scanf("%d%d",&n,&m);
        for(int i=0;i<n;i++)
        {
			visit[i]=0;
			cin>>v[i]>>w[i];
		}
        scanf("%d",&W);
        sum=0;
        dfs(0,0,0,0);
        printf("%d\n",sum);
    }
    system("pause");
    return 0;
}

/*
dfs
从每一个@出发,count+1,dfs其八个方向,遇到@即将它置为*
*/
#include<iostream>
#define N 105
using namespace std;
int m,n;
char map[N][N];
int dx[8]={1,1,0,-1,-1,-1,0,1};
int dy[8]={0,1,1,1,0,-1,-1,-1};
bool check(int x,int y)
{
	if(x>=0&&x<m&&y>=0&&y<n)
	{
		return true;
	}
	else 
	{
		return false;
	}
}
void dfs(int sx,int sy)
{
	map[sx][sy]='*';
	int x,y;
	for(int i=0;i<8;i++)
	{
		x=sx+dx[i];
		y=sy+dy[i];
		if(check(x,y)&&map[x][y]=='@')
		{
			dfs(x,y);
		}
	}
}
		
	
int main()
{
	while(cin>>m>>n,m!=0&&n!=0)
	{
		int count=0;
		for(int i=0;i<m;i++)
		{
			cin>>map[i];
		}
		for(int i=0;i<m;i++)
		{
			for(int j=0;j<n;j++)
			{
				if(map[i][j]=='@')
				{
					count++;
					dfs(i,j);
				}
			}
		}
		cout<<count<<endl;
	}
	system("pause");
	return 0;
}

/*
bfs~
*/
#include<iostream>
#include<queue>
using namespace std;
struct node
{
	int x;
	int step;
};
node s;
node next;
queue<node>q;
int start,end;
int map[205];
int visit[205];
int n;
int dx[2]={1,-1};
int check(int x)
{
	if(x>=1&&x<=n)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
void bfs()
{
	memset(visit,0,sizeof(visit));
	while(!q.empty())
	{
		q.pop();
	}
	s.x=start;
	s.step=0;
	visit[s.x]=1;
	q.push(s);
	while(!q.empty())
	{
		s=q.front();
		q.pop();
		if(s.x==end)
		{
			cout<<s.step<<endl;
			return ;
		}
		for(int i=0;i<2;i++)
		{
			next.x=s.x+dx[i]*map[s.x];;
			next.step=s.step+1;
			if(check(next.x)&&!visit[next.x])
			{
				q.push(next);
				visit[next.x]=1;
			}
		}
	}
	cout<<"-1"<<endl;
}
	
	
int main()
{
	while(cin>>n&&n!=0)
	{
		cin>>start>>end;
		for(int i=1;i<=n;i++)
		{
			cin>>map[i];
		}
		bfs();
	}
	system("pasue");
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值