• HDU1010(bfs)


    #include <stdio.h>
    #include <iostream>
    #include <string.h>
    #include <stdlib.h>
    using namespace std;
    int n,m,t,ax,bx;
    bool flag;
    char plot[9][9];
    int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
    void dfs(int a,int b,int tx){
    if(a<=0||a>n||b<=0||b>m){
    return;}
    if(a==ax&&b==b&&tx==t){
    flag=1;
    return;}
    int temp=(t-tx)-abs(a-ax)-abs(b-bx);
    if(temp<0||temp&1){
    return;}
    for(int i=0;i<4;i++){
    if(plot[a+dir[i][0]][b+dir[i][1]]!='X'){
    plot[a+dir[i][0]][b+dir[i][1]]='X';
    dfs(a+dir[i][0],b+dir[i][1],tx+1);
    if(flag)
    {
    return;
    }
    plot[a+dir[i][0]][b+dir[i][1]] ='.';
    }
    }
    return;
    }

    int main(){
    while(scanf("%d%d%d",&n,&m,&t),n,m,t){
    getchar();
    int si,sj;
    int ss=0;
    for(int i=1;i<=n;i++)
    {

    for(int j=1;j<=m;j++)
    {
    scanf("%c",&plot[i][j]);
    if(plot[i][j]=='S'){si=i;sj=j;}
    if(plot[i][j]=='D'){ax=i;bx=j;}
    if(plot[i][j]=='X')ss++;

    }
    getchar();
    }
    if(n*m-ss<=t){
    printf("NO ");
    continue;
    }
    flag=0;
    plot[si][sj]='X';
    dfs(si,sj,0);
    if(flag)
    printf("YES ");
    else
    printf("NO ");
    }
    return 0;
    }

    这里需要剪枝,我参考了一下大牛的解说;

    http://acm.hdu.edu.cn/forum/read.php?tid=6158

    下面是用javaA过了的

    import java.util.Scanner;
    public class HDU1010{
    static int n,m,t,ax,bx,si,sj;
    static char[][]plot;
    static boolean flag;
    static int dir[][]={{1,0},{0,1},{0,-1},{-1,0}};

    public static void main(String args[]){
    Scanner cin=new Scanner(System.in);
    while(cin.hasNext()){
    n=cin.nextInt();
    m=cin.nextInt();
    t=cin.nextInt();
    if(n==0&&m==0&&t==0)
    break;
    String str[]=new String [n+1];
    for(int i=1;i<=n;i++){
    str[i]=cin.next();
    }
    int ss=0;
    plot=new char[9][9];
    for(int i=1;i<=n;i++){
    for(int j=1;j<=m;j++){
    plot[i][j]=str[i].charAt(j-1);
    if(plot[i][j]=='S'){
    si=i;sj=j;
    }
    if(plot[i][j]=='X'){
    ss++;
    }
    if(plot[i][j]=='D'){
    ax=i;
    bx=j;
    }
    }
    }
    if(n*m-ss<=t){
    System.out.println("NO");
    continue;
    }
    flag=false;
    plot[si][sj]='X';
    dfs(si,sj,0);
    if(flag){
    System.out.println("YES");
    }
    else{
    System.out.println("NO");
    }

    }
    return;
    }

    private static void dfs(int si, int sj, int i) {
    if(si<=0||si>n||sj<=0||sj>m){
    return;
    }
    if(si==ax&&sj==bx&&i==t){
    flag=true;
    return;
    }
    int temp=(t-i)-Math.abs(si-ax)-Math.abs(sj-bx);
    if(temp<0||temp%2==1){
    return;
    }
    for(int j=0;j<4;j++){
    if(plot[si+dir[j][0]][sj+dir[j][1]]!='X'){
    plot[si+dir[j][0]][sj+dir[j][1]]='X';
    dfs(si+dir[j][0],sj+dir[j][1],i+1);
    if(flag)
    return;
    plot[si+dir[j][0]][sj+dir[j][1]]='.';


    }

    }
    return;
    }
    }

  • 相关阅读:
    cookie和session
    ViewState与Session 的重要区别
    C#.Net 中ArrayList 与 Array的区别
    c#如何把文件夹压缩打包然后下载
    关于并发的处理
    const和readonly的区别
    计算某列的字符串相加sql语句
    MS SQL Server存储过程批量修改用户表所有者
    已有打开的与此命令相关联的DataReader,必须首先将它关闭
    XML与数据库
  • 原文地址:https://www.cnblogs.com/1314wamm/p/5660096.html
Copyright © 2020-2023  润新知