水平菜到连个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