zoukankan      html  css  js  c++  java
  • poj 1077 八数码 问题 BFS

    递推式的时候一定要注意+号m+=m+n,左边的加号加不加

    我查了半天啊

    #include<stdio.h>
     #include<iostream>
     #include<string.h>
     #include<stdlib.h>
     #include<queue>
     #include<set>
     #include<stack>
    #include <fstream>
     using namespace std;
    
    #define max 8000003
    
    struct node
    {
    	char state[3][3];
    	int x,y;
    	int pre;
    	char opr;
    
    }all[400000];
    
    int hash[max];
    
    queue<int> qe;
    
    stack<char> st;
    
    node head;
    
    int dirx[4]={1,-1,0,0};
    
    int diry[4]={0,0,1,-1};
    
    int getHash(node n)
    {
    	int i,j;
    	int sum=0;
    	for(i=0;i<3;i++)
    	{
    		for(j=0;j<3;j++)
    		{
    			sum=sum*10+n.state[i][j]-'0';//注意左边没加号
    		}
    	}
    
    	return sum%max;
    }
    
    void getpath(node m)
    {
    	while(m.pre!=-1)
    	{
    		st.push(m.opr);
    		m=all[m.pre];
    	}
    }
    
    void bfs()
    {
    	memset(hash,0,sizeof(hash));
    	node outnode,newnode;
    
    	int hashvalue;
    
    	int curent=0,isok=0,i;
    
    	all[curent]=head;
    	hash[getHash(head)]=1;
    	qe.push(curent);
    	curent++;
    
    	while(!qe.empty())
    	{
    		
    		int index=qe.front();
    		outnode=all[index];
    		qe.pop();
    
    		if(getHash(outnode)==3456735)
    		{
    			isok=1;
    			break;
    		}
    
    		int x=all[index].x;
    		int y=all[index].y;
    
    	//	printf("%d %d %d\n",qe.size(),x,y);
    
    		for(i=0;i<4;i++)
    		{
    			int newx=x+dirx[i];
    			int newy=y+diry[i];
    
    			if(newx<0||newx>2||newy<0||newy>2)continue;
    
    			newnode=outnode;
    
    			swap(newnode.state[x][y],newnode.state[newx][newy]);
    
    			hashvalue=getHash(newnode);
    			if(hash[hashvalue])continue;
    			hash[hashvalue]=1;
    
    			newnode.x=newx;
    			newnode.y=newy;
    			newnode.pre=index;
    
    			if(dirx[i]==0)
    			{
    				if(diry[i]==1)newnode.opr='r';
    				else newnode.opr='l';
    			}
    
    			if(diry[i]==0)
    			{
    				if(dirx[i]==1)newnode.opr='d';
    				else newnode.opr='u';
    			}
    
    			qe.push(curent);
    			all[curent++]=newnode;
    
    		}
    
    	}
    
    	if(!isok)
    	{
    		printf("unsolvable\n");
    		return ;
    	}
    
    	getpath(outnode);
    
    	while(!st.empty())
    	{
    		printf("%c",st.top());
    		st.pop();
    	}
    	printf("\n");
    }
    
    int main(void)
    {
         int i,j;
    
    	 //ifstream cin("input.txt");
    
    	 for(i=0;i<3;i++)
    	 {
    		 for(j=0;j<3;j++)
    		 {
    			cin>>head.state[i][j];
    			if(head.state[i][j]=='x')
    			{
    				head.x=i;
    				head.y=j;
    				head.state[i][j]='0';
    			}
    		 }
    	 }
    
    	 head.pre=-1;
    	 head.opr='0';
         
         bfs();
    
         return 0;
    }
    

      

  • 相关阅读:
    BroadcastReceiver 小结
    Android Manifest.xml 之 Intent-filter
    First Phone Interview
    XDK html development --- Cross Domain Request
    Github Git usage
    为节省内存,动态添加view布局和控件
    相似的概念
    让一个view 获得焦点
    ListView 关于减少耗时方法调用优化
    SearchView 分解设置属性
  • 原文地址:https://www.cnblogs.com/jackes/p/2427933.html
Copyright © 2011-2022 走看看