UVA1600

水平菜到连个BFs都写不对了,唉

看leaderboard上面的代码怎么一堆挂着BFS写深搜的23333(怎么有种挂羊头买狗肉的赶脚)

先贴一份我的代码

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
bool vis[35][35][20];
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
int n,m,K;
int s[25][25];
struct T{
	int x,y;
	int st,k;
}a;
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int res=-1;
		cin>>m>>n>>K;
		for(int i=1;i<=m;i++)
		{
			for(int j=1;j<=n;j++)
			{
				cin>>s[i][j];
			}
		}
		a.k=0;
		a.st=0;
		a.x=1;
		a.y=1;
		memset(vis,0,sizeof vis);
		queue<T> q;
		q.push(a);
		while(!q.empty())
		{
			T w=q.front();q.pop();vis[w.x][w.y][w.k]=1;
			if(w.x==m&&w.y==n){res=w.st;break;}
			for(int i=0;i<4;i++)
			{
				int mx=w.x+dx[i];
				int my=w.y+dy[i];
				if(mx<1||mx>m||my<1||my>n)continue;
					if(s[mx][my]==1)
				    {
					if(w.k<K&&!vis[mx][my][w.k+1])
					{
						T w1;
						w1.x=mx;
						w1.y=my;
						w1.st=w.st+1;
						w1.k=w.k+1;
						q.push(w1);
						vis[mx][my][w1.k]=1;
					}
					}
				    else 
				    {
					  if(!vis[mx][my][0])
					   {
					   	T w1;
						w1.x=mx;
						w1.y=my;
						w1.st=w.st+1;
						w1.k=0;
						q.push(w1);
						//vis[mx][my][w1.k]=1;
					   }
				    }
				}
				
			}cout<<res<<endl;
		}
		
		
	
 } 

这份代码是我写完后照着udebug中的一个小样例改的 莫名其妙的就改对,之后就交了一下子,结果5分钟也没judge出来。

本机又测了一下udebug 上的大样例,电脑烧的嗡嗡作响,答案输出却像便秘一样。。。。(我以为又凉凉了)

结果大样例没过。。。

之后找了一份台湾老哥dalao的代码,非常优秀(haodong

测了一下大样例就非常的顺畅。。。

#include <stdio.h> 
#include <string.h>
#include <queue>
using namespace std;
int g[32][32];
int dist[32][32][32];
const int dx[] = {0, 0, 1, -1};
const int dy[] = {1, -1, 0, 0};
int main() {
    int testcase;
    int N, M, K;
    scanf("%d", &testcase);
    while (testcase--) {
        scanf("%d %d %d", &N, &M, &K);
        for (int i = 0; i < N; i++)
            for (int j = 0; j < M; j++)
                scanf("%d", &g[i][j]);
        memset(dist, 63, sizeof(dist));
        dist[0][0][0] = 0;
        queue<int> X, Y, S;
        int x, y, s, tx, ty, ts;
        X.push(0), Y.push(0), S.push(0);
        while (!X.empty()) {
            x = X.front(), X.pop();
            y = Y.front(), Y.pop();
            s = S.front(), S.pop();
            for (int i = 0; i < 4; i++) {
                tx = x + dx[i], ty = y + dy[i];
                if (tx < 0 || ty < 0 || tx >= N || ty >= M)
                    continue;
                if (g[tx][ty])
                    ts = s + 1;
                else
                    ts = 0;
                if (ts > K)	continue;
                if (dist[tx][ty][ts] > dist[x][y][s] + 1) {
                    dist[tx][ty][ts] = dist[x][y][s] + 1;
                    X.push(tx), Y.push(ty), S.push(ts);
                }
            }
        }
        int ret = 0x3f3f3f3f;
        for (int i = 0; i <= K; i++)
            ret = min(ret, dist[N-1][M-1][i]);
        printf("%d\n", ret == 0x3f3f3f3f ? -1 : ret);
    }
    return 0;
}

得好好学习一下

彩蛋:

后来看着我30分钟前交的代码竟然过了,UVA上数据果然弱呀2333333

猜你喜欢

转载自blog.csdn.net/jhber/article/details/88073959
今日推荐