社区讨论

测试数据好像错了

P3956[NOIP 2017 普及组] 棋盘参与者 5已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@mi6yw70a
此快照首次捕获于
2025/11/20 13:04
4 个月前
此快照最后确认于
2025/11/20 13:04
4 个月前
查看原帖
如题
第三个测试点如下
CPP
输入
3 5
1 1 0
1 3 1
2 2 1
2 3 0
3 1 1

输出
ਸ਼
代码 :
CPP
#include<iostream>
#include<stdio.h>
using namespace std;
int f[105][105],a[105][105];
bool o[105][105];
int n,m,i,j,x,y,t;
int dx[4]={1,-1,0,0},
    dy[4]={0,0,1,-1};
void mset()
{
    int i,j;
    for (i=0; i<=104; i++)
        for (j=0; j<=104; j++) f[i][j]=2e8; 
}
int dfs(int x,int y,bool temp,int color)
{
    if (x==n && y==n) return 0;
    if (f[x][y]!=2e8) return f[x][y];
    int i,tempx,tempy;
    o[x][y]=true;
    for (i=0; i<4; i++)
    {
        tempx=x+dx[i];
        tempy=y+dy[i];
        if (!o[tempx][tempy] && tempx>0 && tempx<=n && tempy>0 && tempy<=n) 
        {
            if (temp==true) 
            {
                if (a[tempx][tempy]==color) f[x][y]=min(f[x][y],dfs(tempx,tempy,true,a[tempx][tempy])); else 
                    if (a[tempx][tempy]==0) f[x][y]=min(f[x][y],dfs(tempx,tempy,false,color)+2); else 
                        f[x][y]=min(f[x][y],dfs(tempx,tempy,true,a[tempx][tempy])+1);
            } else 
            {
                if (a[tempx][tempy]==color) f[x][y]=min(f[x][y],dfs(tempx,tempy,true,a[tempx][tempy])); else
                	if (a[tempx][tempy]!=0) f[x][y]=min(f[x][y],dfs(tempx,tempy,true,a[tempx][tempy])+1);
            }
        }
    }
    o[x][y]=false;
    return f[x][y];
}
int main()
{
    mset();
    cin>>n>>m;
    for (i=1; i<=m; i++) 
    {
        cin>>x>>y>>t;
        a[x][y]=t+1;
    }
    f[n][n]=0;
    dfs(1,1,true,a[1][1]);
    if (f[1][1]==2e8) cout<<-1<<endl; else cout<<f[1][1]<<endl;
}

回复

5 条回复,欢迎继续交流。

正在加载回复...