概况:
\(T1\) | \(T2\) | \(T3\) | \(T4\) | \(T5\) | \(T6\) | \(T7\) | \(T8\) | \(sum\) |
---|---|---|---|---|---|---|---|---|
\(60\) | \(60\) | \(100\) | \(4.8\) | \(100\) | \(50\) | $ 0$ | \(30\) | \(404.8\) |
未达到满分题:\(1,2,4,6,7,8\)
\(T1\)
题目描述
小 \(A\) 和可多喜欢互相切磋井字棋。井子棋就是在九宫格里面轮流放入 \(1\) 和 \(2\),谁连成 \(3\) 个就赢了。虽然小 \(A\) 很努力地记录棋谱,可还是下不过可多。由于小 \(A\) 比较笨,可多总是让他先。小 \(A\) 下的第一个子一定是在中心。这回小 \(A\) 希望使用计策。目前棋局刚开始,棋盘上有不大于 \(3\) 颗棋子,小 \(A\) 想知道,根据目前的局势,他有没有必胜策略(也就是自己以最佳方案下棋,无论对手怎么下,自己必胜)。
输入描述
共 \(3\)行,表示棋局,\(1\) 表示小 \(A\),\(2\) 表示可多,\(0\) 表示没有落子。保证棋子数不超过 \(3\) 个。
输出描述
共 \(2\) 行。
第 \(1\) 行,如果小 \(A\) 赢,输出 "A will win."
,
如果不知道,输出 "Dont know."
。
第 \(2\) 行,输出棋局刚开始时他们已经下了几个棋子。
样例1
输入
0 0 0
0 1 0
0 0 0
输出
Dont know.
1
样例2
输入
0 0 0
0 1 0
0 2 1
输出
A will win.
3
考场代码 \((60p)\):
正解思路:
由题目中可知,我们能够获取到 \(5\) 个直接条件,\(1\) 个推导条件:
- 在九宫格里面轮流放入 \(1\) 和 \(2\),连成 \(3\) 个就赢了
- 小 \(A\) 先
- 小 \(A\) 的第一个子一定是在中心
- \(1\) 表示小 \(A\),\(2\) 表示可多,\(0\) 表示没有落子
- 保证棋子数不超过 \(3\) 个
- 可多最多只有 \(1\) 个棋子
由于重重限制,使得这个问题没有太多的可能性,我们可以考虑使用 if语句
判断来解决这个问题,直接且时间复杂度低。所以将所有的 Dont know
通过 if语句
排除,剩下的就是 A will win.
Dont know
情况:
- 只有 \(1\) 个子
- 可多下在角落
- 有一列或一行全都落子
正解代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int a[5][5],cnt=0;
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++)
cin>>a[i][j];
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++)
if(a[i][j]!=0)
cnt++;
if(cnt==1){
puts("Dont know.");
cout<<1;
return 0;
}
if(a[1][1]==2||a[1][3]==2||a[3][1]==2||a[3][3]==2){
puts("Dont know.");
cout<<cnt;
return 0;
}
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++){
a[i][4]=a[i][1]+a[i][2]+a[i][3];
a[4][j]=a[1][j]+a[2][j]+a[3][j];
}
if(cnt==3){
for(int i=1;i<=3;i++){
if(a[i][4]==4||a[4][i]==4){
puts("Dont know.");
cout<<3;
return 0;
}
}
}
puts("A will win.");
cout<<cnt;
return 0;
}