您的位置:首页 > 其它

洛谷 3956 棋盘

2018-01-06 08:04 197 查看

NOIP血腥的……

#include <cstdio>
#include <algorithm>
using namespace std;
int ans=2147483647,n,m,x,y,t,u;
int main(){
freopen("chess.in","r",stdin);
freopen("chess.out","w",stdout);
printf("%d",-1);
return 0;
}


好不开心。

后来重新做了一遍,做对了!

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1};
int d[101][101],f[101][101],n,m,x,y,t,ans=2139062143;
void dfs(short x,short y,short sum,bool fl){
if (x<1||x>m||y<1||y>m) return;//边界
if (sum>=f[x][y]) return;//超过了不要了
if (x==m&&y==m){ans=(ans>sum)?sum:ans; return;}
f[x][y]=sum;//赋值
for (int i=0;i<4;i++){
int nx=x+dx[i],ny=y+dy[i];
if (d[nx][ny]){//有颜色
if (d[nx][ny]==d[x][y]) dfs(nx,ny,sum,0);//颜色相同
else dfs(nx,ny,sum+1,0);//颜色不同
}
else if (!d[nx][ny]&&!fl){//没有颜色没有使用魔法
d[nx][ny]=d[x][y];//变颜色
dfs(nx,ny,sum+2,1);
d[nx][ny]=0;//回溯
}
}
}
int main(){
scanf("%d%d",&m,&n); f[1][1]=0; memset(f,127,sizeof(f));
for (int i=1;i<=n;i++)
scanf("%d%d%d",&x,&y,&t),d[x][y]=t+1;
dfs(1,1,0,0);  if (ans!=2139062143) printf("%d",ans); else printf("-1"); return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: