poj2243 hdu1372 floyid warshall

8 篇文章 0 订阅

可以通过图的连通性进行求解。floyid算法也是比较好理解的。但和bfs比较它的空间复杂度较高。

    #include <iostream>
    #include <string>
    using namespace std;

    const int chess = 9;
    int w[chess][chess][chess][chess];


    bool position(int x,int y)
    {
    	if(x > 0 && x < chess && y >0 && y <chess)
    		return true;
    	return false;
    }

    void init()
    {
    	memset(w,-1,sizeof(w));
    	for(int x = 1;x < chess;x++)
    		for(int y = 1;y < chess;y++)
    		{
    			if(position(x + 1,y + 2))
    				w[x][y][x + 1][y + 2] = 1;
    			if(position(x + 2,y + 1))
    				w[x][y][x + 2][y + 1] = 1;
    			if(position(x - 1,y + 2))
    				w[x][y][x - 1][y + 2] = 1;
    			if(position(x -2,y +1))
    				w[x][y][x -2][y +1] = 1;
    			if(position(x + 1,y - 2))
    				w[x][y][x + 1][y - 2] = 1;
    			if(position(x + 2,y -1))
    				w[x][y][x + 2][y - 1] = 1;
    			if(position(x - 1,y - 2))
    				w[x][y][x - 1][y - 2] = 1;
    			if(position(x -2,y -1))
    				w[x][y][x -2][y -1] = 1;
    		}//for int y
    		for(int kx = 1;kx < chess;kx++)
    			for(int ky = 1; ky < chess;ky++)
    				for(int ix = 1;ix < chess ;ix++)
    					for(int iy = 1;iy < chess;iy++)
    						for(int jx = 1;jx < chess;jx++)
    							for(int jy = 1;jy < chess;jy++)
    							{
    								if(w[ix][iy][jx][jy] > w[ix][iy][kx][ky] + w[kx][ky][jx][jy] && w[ix][iy][kx][ky] >0 && w[kx][ky][jx][jy] > 0)
    										w[ix][iy][jx][jy] = w[ix][iy][kx][ky] + w[kx][ky][jx][jy];						
    								else if(-1==w[ix][iy][jx][jy] && w[ix][iy][kx][ky] >0 && w[kx][ky][jx][jy] > 0 )
    									w[ix][iy][jx][jy] = w[ix][iy][kx][ky] + w[kx][ky][jx][jy];
    							}
    }

    int main()
    {
    	//freopen("in.txt","r",stdin);
    	//freopen("out.txt","w",stdout);
    	string s1,s2;
    	int res;
    	init();
    	while(cin>>s1>>s2)
    	{
    		int x,y,m,n;
    		x = s1[0] - 'a' + 1;
    		y = s1[1] - '0';
    		m = s2[0] - 'a' + 1;
    		n = s2[1] - '0';

    		if(x==m && y==n)
    			res = 0;
    		else
    			res = w[x][y][m][n];
    		cout<<"To get from "<<s1<<" to "<<s2<<" takes "<<res<<" knight moves."<<endl;
    	}
    	return 0;
    }


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值