Hdoj1206,Ignatius and the Princess I

来源:互联网 发布:java调用传感器 编辑:程序博客网 时间:2024/05/06 19:27

1.首先这道题使用广搜解决的。问题两点,就是深搜和路径的输出。

2.这道题也可以用深搜,但是超时。也就是下面的深搜可以得到答案,但是提交的话就是超时。

3.关于超时的原因。首先,从理论上说,深搜和广搜复杂度差不多,只不过在某些情况下某一种会好一点。因为如果不剪枝,二者都需要遍历所有情况。找路径的存在性问题用深搜。路径的最短问题用广搜。但是这里的话,加入了剪枝。广搜加入剪枝,实在判断下一个可不可以走之前剪,而深搜则是之后。因此导致广搜加了剪枝之后必然每个点只遍历一次,但是深搜无法保证。再加上优先队列的应用,导致二者复杂度有了质的区别。

4.使用优先队列别忘了重载小于号。

5.下面的程序里深搜和广搜都有,用那一个就把另一个注释掉。

#include<iostream>#include<cstdio>#include<queue>#include<cstring>#include<ctype.h>using namespace std;#define maxn 1005//#define _CRT_SECURE_NO_WARNINGchar maze[maxn][maxn];int n,m;int time;int mintime;int flag;int X[4] ={0,0,1,-1};int Y[4]={1,-1,0,0};struct Node {int prex,prey;int length;char c;int x,y;bool operator <(const Node &n) const{return n.length < length;}};Node visited[maxn][maxn];void dfs(int x, int y, int prelength);void print(int x, int y);void bfs();int main(){while(scanf_s("%d%d", &n,&m)!=EOF){for ( int i = 0; i < n; i++ ){//scanf("%s",maze[i]);for ( int j = 0; j < m; j++ ){cin >> maze[i][j];visited[i][j].c = maze[i][j];visited[i][j].length = 9999;visited[i][j].prex = -1;visited[i][j].prey = -1;visited[i][j].x = i;visited[i][j].y = j;}}flag = 0;time = 0;mintime = 9999;dfs(0,0,0);//bfs();if(flag){//cout << mintime<<endl;printf("It takes %d seconds to reach the target position, let me show you the way.\n",visited[n-1][m-1].length);print(n-1,m-1);printf("FINISH\n");}else {//printf("God please help my hero\n");printf("God please help our poor hero.\n");            printf("FINISH\n");}}}void bfs(){priority_queue<Node> qu;Node a ;visited[0][0].length = 0;qu.push(visited[0][0]);while(qu.empty()==false){a = qu.top();qu.pop();if(a.x==n-1&&a.y==m-1){flag = 1;return;}for ( int i = 0; i < 4; i++ ){int x1 = a.x+X[i];int y1 = a.y+Y[i];if(x1>=0&&x1<n&&y1>=0&&y1<m){if(visited[x1][y1].c =='.'&&visited[x1][y1].length>a.length+1){visited[x1][y1].length = a.length +1;visited[x1][y1].prex = a.x;visited[x1][y1].prey = a.y;qu.push(visited[x1][y1]);}else if(isdigit(visited[x1][y1].c)&&visited[x1][y1].length>a.length+1+(visited[x1][y1].c-'0')){visited[x1][y1].length = a.length+1+(visited[x1][y1].c-'0');visited[x1][y1].prex = a.x;visited[x1][y1].prey = a.y;    qu.push(visited[x1][y1]);}}}}}void print(int x, int y){//cout << "kaka"<<endl;if(x ==-1||y==-1){return;}int prex = visited[x][y].prex;int prey = visited[x][y].prey;//Node a = visited[x][y];if(prex!=-1&&prey!=-1){int prelength1 = visited[prex][prey].length;int length1 = visited[x][y].length;print(prex,prey); printf("%ds:(%d,%d)->(%d,%d)\n",prelength1+1,prex,prey,x,y);//cout << visited[prex][prey].length+1<<": ("<<visited[x][y].prex<<" , "<<visited[x][y].prey<<" ) --> ( "<<x<<" , "<<y <<" )"<<endl;//for ( int i = prelength1+2; i<=length1;i++)//{//cout <<i<<" : "<<"Fight at ("<<x<<" , "<<y<<" )" <<endl;//} for(int i=prelength1+2;i<=length1;i++)    {        printf("%ds:FIGHT AT (%d,%d)\n",i,x,y);    }//x = prex;//y = prey;//prex = visited[x][y].prex;//prey = visited[x][y].prey;}}void dfs(int x, int y, int prelength){visited[x][y].length = prelength;if(x<0||x>=n||y<0||y>=m){flag = 0;return;}if(x==n-1&&y==m-1){flag = 1;if(time<mintime)mintime = time;//cout << time<<endl;//cout << mintime<<endl;return;}for ( int i = 0; i < 4; i++ ){//cout << "kaka"<<endl;int newx = x + X[i];int newy = y+Y[i];if(maze[newx][newy]=='.'&&prelength+1<visited[newx][newy].length){visited[newx][newy].prex = x;visited[newx][newy].prey = y;maze[newx][newy] = 'X';visited[newx][newy].length=prelength+1;time++;dfs(newx, newy, prelength+1);time--;maze[newx][newy]='.';}else if(maze[newx][newy]>='1'&&maze[newx][newy]<='9'){int a = maze[newx][newy]-'0';if(prelength+a+1<visited[newx][newy].length){visited[newx][newy].prex = x;visited[newx][newy].prey = y;visited[newx][newy].length=prelength+a+1;time+=a;time++;maze[newx][newy]='X';dfs(newx,newy, prelength+a+1);maze[newx][newy]='0'+a;time-=a;time++;}}}}


0 0
原创粉丝点击